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

5hcedyr0  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(311)

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

public class FooPool{
    ...
    private final AtomicInteger poolCount = new AtomicInteger(0);
    ...

    private void incrementPoolCount(){
        synchronized (this) {
            if(!poolCount.get() >= maxSize) {
                poolCount.incrementAndGet();
            }
        }
    }
}

在我看来,使用 synchronized 关键字来调用 Atomic- 类提供了,因为据我所知,这些方法已经是线程安全的方法了。
请告诉我,如果我错过了什么或是有任何情况下,你使用这两个表达式一起,以确保线程安全。
谢谢

ktca8awb

ktca8awb1#

在lock下执行的代码首先检查一个条件,然后更改条件所依赖的值。
如果这两个动作不是原子的,那么两个线程可以读取 poolCount 同时等于 maxSize 减一,因此增加两倍,在上面 maxSize .
所以,需要锁。
如果 poolCount 不在其他地方使用,或仅与持有的同一锁一起使用,或仅为读取,可以用 int 变量, volatile 视情况而定。

相关问题