我正在阅读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快一点。理想情况下可以说它们都是相同的)
那么在这种情况下波动的重点是什么?
答案 0 :(得分:1)
Volatile用于确保修改后的计数器值正确传播到所有线程。它还为Java编译器提供了不以不安全方式优化变量的提示。因此,如果没有波动,可能会:
int counter = 0;
线程1:修改计数器,将其设置为1. Java编译器优化代码,使值1存储在CPU寄存器或CPU缓存中。
线程2:几个微秒LATER,线程2读取计数器并且它仍然是0,因为线程1还没有将计数器刷新到共享内存中。