如果可能的话,我正在审查和重构我同事的旧代码。我发现这个类使用 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-
类提供了,因为据我所知,这些方法已经是线程安全的方法了。
请告诉我,如果我错过了什么或是有任何情况下,你使用这两个表达式一起,以确保线程安全。
谢谢
1条答案
按热度按时间ktca8awb1#
在lock下执行的代码首先检查一个条件,然后更改条件所依赖的值。
如果这两个动作不是原子的,那么两个线程可以读取
poolCount
同时等于maxSize
减一,因此增加两倍,在上面maxSize
.所以,需要锁。
如果
poolCount
不在其他地方使用,或仅与持有的同一锁一起使用,或仅为读取,可以用int
变量,volatile
视情况而定。