我有一个带有静态方法的类,如下所示修改静态变量,这个方法是否需要同步以进行线程安全操作?
public final class IdManager {
private static int noOfIdsInReserveCurrently = 100;
private static final AtomicInteger allotedUserIdsCount;
public static int getNewId(){
noOfIdsInReserveCurrently--;
....
return allotedUserIdsCount.incrementAndGet();
}
}
此方法是否已同步?
答案 0 :(得分:8)
当然,这肯定不安全。两个线程都可以读取值,但是减少它们的本地副本,然后写入。不良。
你可以同步它(以及变量的所有其他方面) - 但最好使用专为这类事情设计的AtomicInteger
。如果您正在修改的仅共享状态是一个值,那就没关系;如果你试图原子地修改更多的共享状态(例如一些“下一个ID”计数器以及未完成的ID的数量),那么你需要 这个事情真的,非常仔细地讨论各种交错,或使用同步块。