百科问答小站 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对于int变量a,如何以最快速度计算34*a? 
  学了 3 年 Java,包括自学和大学学习,如今工作一开始需要我学 C#,觉得不甘心怎么办? 
  Java中 栈内存的存取速度仅次于寄存器,如何做到的? 
  在编程语言中,循环语句为何选择 while 而不是 when 作为关键词? 
  程序员开发无代码平台成功后会不会被开除? 
  C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么? 
  0基础开始,Leetcode200道题要多久左右? 
  汇编下call和ret指令是否有内存屏障的作用? 
  Java 的开发效率究竟比 C++ 高在哪里? 
  朋友自杀前把名字改成了nullptr,是什么意思? 

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





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