在AtomicReference中使用功能接口的理由是什么?它会提供与synchronized类似的担保吗?或者它只是为其他线程的更改提供了可见性保证,如在volatile中。
我遇到了以下在谓词中使用AtomicReference的示例,这让我思考了一下:
发布于 2021-12-28 08:47:22
下面是带有功能接口的getAndUpdate的小代码。
public final V getAndUpdate(UnaryOperator<V> updateFunction) {
V prev = get(), next = null;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.apply(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}确保变量和weakCompareAndSetVolatile的可见性的易失性帮助确保其他线程不会更改该值。这就是为什么函数接口在传递到AtomicReference时仍然是安全的。
发布于 2021-12-30 05:03:57
需要确定的关键部分是,共享变量的写入和读取不应处于数据竞争中。当您有两个内存操作到相同的位置时,您会得到一个数据竞赛,其中至少有一个是写操作,并且这些操作不是按发生的顺序排列的--在边缘之前。
在一个易失性变量的写入和该变量的所有后续读取之间发生了一个先于边缘的情况。此边缘是易失性变量规则的结果。
对于同步块来说,它要复杂一些。
如果你有这样的东西:
int a;
// thread 1
synchronized(this){
a=1 (1)
} (2)
// thread 2
synchronized(this){ (3)
int b=a (4)
...
}如果(2)与(3)同步,则下列内容保持不变:
(1)由于程序顺序规则而在(2)之前发生。
(2)由于监视锁定规则,在(3)之前发生。
(3)由于程序顺序规则,在(4)之前发生。
因为发生-之前是传递性的,(1)发生-在(4)之前。
因此,从内存模型的角度来看,易失性和同步是非常相似的。
回到AtomicReference:有什么特定的方法要深入研究吗?
https://stackoverflow.com/questions/70503673
复制相似问题