首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用原子对象和同步在一起不是多余的吗?

使用原子对象和同步在一起不是多余的吗?
EN

Stack Overflow用户
提问于 2020-11-16 12:25:17
回答 1查看 33关注 0票数 0

我正在审查和重构,如果可能的话,我的同事的旧代码。我发现这个类使用AtomicInteger作为字段变量,它还使用sychronized(this)来更新变量的值。

代码如下所示

代码语言:javascript
复制
public class FooPool{
    ...
    private final AtomicInteger poolCount = new AtomicInteger(0);
    ...
    
    private void incrementPoolCount(){
        synchronized (this) {
            if(!poolCount.get() >= maxSize) {
                poolCount.incrementAndGet();
            }
        }
    }
}

在我看来,使用synchronized关键字调用Atomic-类提供的方法是多余的,因为据我所知,这些方法已经是线程安全的方法。

如果我遗漏了什么,请告诉我,或者是否有任何情况下,您可以同时使用这两个表达式来确保线程安全。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 16:06:08

在lock下执行的代码首先检查一个条件,然后更改该条件所依赖的值。

如果这两个操作不是原子的,当poolCount等于maxSize减1时,两个线程可以同时读取它,因此在maxSize之上将其递增两次。

因此,锁是必需的。

如果poolCount不在其他地方使用,或者仅在持有相同锁的情况下使用,或者是只读的,则可以使用int变量替换它,根据情况选择volatile

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

https://stackoverflow.com/questions/64852695

复制
相关文章

相似问题

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