我正在审查和重构,如果可能的话,我的同事的旧代码。我发现这个类使用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-类提供的方法是多余的,因为据我所知,这些方法已经是线程安全的方法。
如果我遗漏了什么,请告诉我,或者是否有任何情况下,您可以同时使用这两个表达式来确保线程安全。
谢谢
发布于 2020-11-16 16:06:08
在lock下执行的代码首先检查一个条件,然后更改该条件所依赖的值。
如果这两个操作不是原子的,当poolCount等于maxSize减1时,两个线程可以同时读取它,因此在maxSize之上将其递增两次。
因此,锁是必需的。
如果poolCount不在其他地方使用,或者仅在持有相同锁的情况下使用,或者是只读的,则可以使用int变量替换它,根据情况选择volatile。
https://stackoverflow.com/questions/64852695
复制相似问题