AtomicInteger:getVolatile与getAcquire

时间:2018-12-28 21:16:30

标签: jls

使用时,getVolatilegetAcquire有什么区别AtomicInteger

PS:与

有关
  

与边缘同步的源称为发行版,而   目的地称为“获取”。

来自https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.3

1 个答案:

答案 0 :(得分:1)

这一切都归结于我们如何优化代码。重新排序代码方面的优化。编译器可能会重新排序以进行优化。 getAquire确保其后的指令不会在其之前执行。这些指令可能会重新排序,但它们将始终在getAquire之后执行。

这与setRelease(对于VarHandle)结合使用,其中setRelease确保在发生之前不会发生重新排列的事情。

示例:

Thread1:

    var x = 1;
    var y = 2;
    var z = 3;

    A.setRelease(this, 10)

x,y和z的分配将在A.setRelease之前进行,但可能会对其重新排序。

Thread 2:

if (A.getAquire(this) == 10) {
  // we know that x is 1, y is 2 and z = 3
}

这是并发程序的一个很好的用例,您不必在所有应用程序上增加波动性,而只需要先执行一些指令即可。

对于getVolatile,该变量被视为与Java中的所有volatile变量一样。无需重新排序或优化。

很高兴看到这个video,可以理解所谓的“内存排序模式”是普通的,不透明的,释放/获取和易失的。