百科问答小站 logo
百科问答小站 font logo



下面代码是线程不安全的代码,请问为什么很难跑出不安全的样例? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

首先题主请务必纠正一个误解:线程不安全指的是“不保证会得到预期安全的行为”,而不是“保证不会得到预期安全的行为”。这是个逻辑问题而不是Java、多线程问题。

当您观察到一次实验的结果与预期的“安全”行为一致时,并不代表它就是安全的了。“不保证会得到预期安全的行为”也允许有些时候可以运行得到预期的结果,只是“没有保证”而已。

然而没有保证就是头疼的地方了。您听说过因为没有正确同步而在大并发条件下在HashMap.get()里死循环的案例不?这就是“不保证安全”,然后很多时候似乎也运行得到了预期的结果,然后放上生产环境压一压就垮的案例。

@木女孩

说得对。这个并发量级太低了。

另外代码在被JIT编译过后更容易观察到各种有趣的结果。所以把题主的例子稍微调整了一下结构来帮助它预热一小下:

       public class UnsafeSequence {     private int value;      public UnsafeSequence(int value) {         this.value = value;     }      public int getValue(){         return value++;     }      private static class MyRunnable implements Runnable {         private final UnsafeSequence seq;          MyRunnable(UnsafeSequence seq) {           this.seq = seq;         }          @Override         public void run() {             try {                 Thread.sleep(100);                 for (int i = 0; i < 1000; i++) {                     System.out.println(Thread.currentThread().getName() + ":" + seq.getValue());                 }             } catch (InterruptedException ex) {             }         }     }      // warm up MyRunnable.run(), make sure MyRunnable.run() is JIT compiled     private static void warmUp() {         UnsafeSequence unsafeSequence = new UnsafeSequence(0);         MyRunnable r = new MyRunnable(unsafeSequence);         // warm up MyRunnable.run()         for (int i = 0; i < 100; i++) {           r.run();         }     }      public static void main(String[] args) {         warmUp();          UnsafeSequence unsafeSequence = new UnsafeSequence(0);         MyRunnable r = new MyRunnable(unsafeSequence);                  for (int i = 0; i < 5000; i++) {             new Thread(r).start();         }     } }      

截取一段输出给题主参考:

       Thread-1439:68297 Thread-1439:585663 Thread-1439:585664 Thread-1439:585665 Thread-1439:585666 Thread-1439:585667 Thread-1439:585668 Thread-1438:68295 Thread-1438:585670 Thread-1438:585671      



  

相关话题

  java程序员的技术更新那么快,为什么每个技术还要读源码,会使用不就好了吗?技术那么多也学不完啊? 
  如何通俗易懂解释 Java 语言所谓「一次编写,到处运行」的特性? 
  Java的同步机制比起pthread方式有何优点? 
  学习编程必须要会英语吗? 
  多个 CPU 操作多线程对主内存中某一共享变量同时进行写入操作可以做到吗? 
  java能否获取到引用的名称? 
  买了《阿里巴巴JAVA开发手册》的人,后悔了吗? 
  加了第一个同步不是会全部代码执行完吗,为什么出现死锁? 
  自学java,学多久可以自己找到工作? 
  如何反驳“代码混淆只是降低了可读性,安全性并没有得到实质提升”的观点? 

前一个讨论
电灯泡塞嘴里真的拔不出来吗?
下一个讨论
如何看待11月4日暴走大事件王尼玛关于信仰的言论?





© 2025-05-29 - tinynew.org. All Rights Reserved.
© 2025-05-29 - tinynew.org. 保留所有权利