首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AtomicReference内部使用功能接口

在AtomicReference内部使用功能接口
EN

Stack Overflow用户
提问于 2021-12-28 06:52:25
回答 2查看 77关注 0票数 1

AtomicReference中使用功能接口的理由是什么?它会提供与synchronized类似的担保吗?或者它只是为其他线程的更改提供了可见性保证,如在volatile中。

我遇到了以下在谓词中使用AtomicReference的示例,这让我思考了一下:

https://github.com/corda/token-sdk/blob/master/modules/selection/src/main/kotlin/com.r3.corda.lib.tokens.selection/memory/services/VaultWatcherService.kt#L240

EN

回答 2

Stack Overflow用户

发布于 2021-12-28 08:47:22

下面是带有功能接口的getAndUpdate的小代码。

代码语言:javascript
复制
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时仍然是安全的。

https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReference.java

票数 0
EN

Stack Overflow用户

发布于 2021-12-30 05:03:57

需要确定的关键部分是,共享变量的写入和读取不应处于数据竞争中。当您有两个内存操作到相同的位置时,您会得到一个数据竞赛,其中至少有一个是写操作,并且这些操作不是按发生的顺序排列的--在边缘之前。

在一个易失性变量的写入和该变量的所有后续读取之间发生了一个先于边缘的情况。此边缘是易失性变量规则的结果。

对于同步块来说,它要复杂一些。

如果你有这样的东西:

代码语言:javascript
复制
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:有什么特定的方法要深入研究吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70503673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档