百科问答小站 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      



  

相关话题

  命令式语言中递归的理论基础? 
  程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧? 
  注解参数为什么不支持Object? 
  自学编程后,找工作简历该怎样写? 
  江湖上流传着哪些关于R大RednaxelaFX的黑暗传说? 
  c#多播或event监听太多后gc和时间都会爆炸,那么比起List<Action>存在的意义是什么? 
  编程用英语命名的时候,万一那些单词成为关键字了怎么办? 
  为什么 Python 工程师很少像 Java 工程师那样讨论垃圾回收? 
  Java 岗位面试,面试官最后说,你还有什么要问的吗? 
  Qt 真的比 Java 更加跨平台吗? 

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





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利