线程易失性

时间:2018-06-11 09:30:50

标签: java multithreading thread-safety

我正在阅读java中的volatile,这里有一个很好的解释http://tutorials.jenkov.com/java-concurrency/volatile.html

它表示在情况下挥发性很好......

  

只有线程1写入共享计数器变量,声明   计数器变量volatile足以确保线程2   总能看到最新的书面价值。

volatile int counter = 0;

但是当两个线程,Thread1写入(计数器++)到volatile并且Thread2同时读取volatile 时,Thread2可能会将计数器作为0(将计数器作为1表示它意味着Thread2会等待Thread1写入,但原子性不存在于volatile中,或者Thread1比Thread2快一点。理想情况下可以说它们都是相同的)

那么在这种情况下波动的重点是什么?

1 个答案:

答案 0 :(得分:1)

Volatile用于确保修改后的计数器值正确传播到所有线程。它还为Java编译器提供了不以不安全方式优化变量的提示。因此,如果没有波动,可能会:

int counter = 0;

线程1:修改计数器,将其设置为1. Java编译器优化代码,使值1存储在CPU寄存器或CPU缓存中。

线程2:几个微秒LATER,线程2读取计数器并且它仍然是0,因为线程1还没有将计数器刷新到共享内存中。