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



  

相关话题

  C#有哪些有名的依赖注入的框架? 
  现在(2021年)OSGi的发展前景如何? 
  Java里面的封装是不是多此一举? 
  Node.js 未来会超越 Java 吗? 
  如何通俗易懂解释 Java 语言所谓「一次编写,到处运行」的特性? 
  如何理解互斥锁、条件锁、读写锁以及自旋锁? 
  Java内存模型和Java内存区域的区别和联系? 
  优化代码中大量的if/else,你有什么方案? 
  如何通俗地理解「分布式系统」,它解决了哪些问题,有什么优缺点? 
  Java对于int变量a,如何以最快速度计算34*a? 

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





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利