在非同步静态方法中修改静态变量,是否存在线程安全的危险?

时间:2012-03-31 09:34:18

标签: java

我有一个带有静态方法的类,如下所示修改静态变量,这个方法是否需要同步以进行线程安全操作?

public final class IdManager {

    private static int noOfIdsInReserveCurrently = 100;   
    private static final AtomicInteger allotedUserIdsCount; 

    public static int getNewId(){
         noOfIdsInReserveCurrently--;
         ....
         return allotedUserIdsCount.incrementAndGet();
    }
}

此方法是否已同步?

1 个答案:

答案 0 :(得分:8)

当然,这肯定不安全。两个线程都可以读取值,但是减少它们的本地副本,然后写入。不良。

可以同步它(以及变量的所有其他方面) - 但最好使用专为这类事情设计的AtomicInteger。如果您正在修改的共享状态是一个值,那就没关系;如果你试图原子地修改更多的共享状态(例如一些“下一个ID”计数器以及未完成的ID的数量),那么你需要 这个事情真的,非常仔细地讨论各种交错,使用同步块。