Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在非同步静态方法中修改静态变量,对线程安全有危险吗?_Java - Fatal编程技术网

Java 在非同步静态方法中修改静态变量,对线程安全有危险吗?

Java 在非同步静态方法中修改静态变量,对线程安全有危险吗?,java,Java,我有一个类,其中有一个静态方法,修改了一个静态变量,如下所示,这个方法是否需要同步以实现线程安全操作 public final class IdManager { private static int noOfIdsInReserveCurrently = 100; private static final AtomicInteger allotedUserIdsCount; public static int getNewId(){ noO

我有一个类,其中有一个静态方法,修改了一个静态变量,如下所示,这个方法是否需要同步以实现线程安全操作

public final class IdManager {

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

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

这个方法应该被同步吗?

好吧,它肯定不安全。两个线程都可以读取该值,但减少其本地副本,然后都写入。不好


您可以同步它(以及变量的所有其他方面),但最好使用专门为这类事情设计的。如果您要修改的唯一共享状态是这一个值,那么这很好;如果您试图以原子方式修改更多共享状态(例如,一些“下一个ID”计数器以及未完成ID的数量),那么您需要非常非常仔细地处理各种交错,或者使用同步块来代替。

@JohanSjöberg:您所说的“线程存在于另一个类中”是什么意思?我的观点是,如果两个线程都读100,减量,然后写99,那么会有两个逻辑减量,但总体结果将是不正确的(99而不是98)。@JonSkeet:谢谢,正如你正确猜测的那样,我还在同一个类中使用另一个AtomicInteger对象(在我的问题中更新了),因此,除了共享状态(您的第二个选项不太清楚)之外,是否应该让此方法同步,还是让
NoOfidSinReserveCurrent
,一个
AtomicInteger
?@用户:我不知道-我们需要更多关于您尝试执行的操作的信息。在这种情况下,当我不确定时,使方法同步将是更安全的选择,对吗?@user:是的。尽管您需要查看访问该共享状态的其他任何地方。