使用时,getVolatile
与getAcquire
有什么区别AtomicInteger
?
PS:与
有关与边缘同步的源称为发行版,而 目的地称为“获取”。
来自https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.3
答案 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,可以理解所谓的“内存排序模式”是普通的,不透明的,释放/获取和易失的。