是否需要同步构造函数中对共享静态变量的访问?

时间:2012-03-01 19:56:22

标签: java multithreading constructor synchronization static-members

我知道构造函数不能在Java中同步。这是否意味着如果构造函数修改了类中的静态变量,并且如果可以从多个线程调用构造函数,那么访问需要同步,如图所示?

public class MyClass {
  private static int count = 0;

  public MyClass() {
    synchronized(MyClass.class) {
      count++;
    }
    ...
  }
}

3 个答案:

答案 0 :(得分:8)

绝对 - 毕竟,它可能通过许多线程访问共享资源。我个人只会使用AtomicInteger代替。

public class MyClass {
  private static final AtomicInteger count = new AtomicInteger();

  public MyClass() {
    count.incrementAndGet();
  }
}

请注意,我们现在可以将变量设为final,因为变量不会更改值,我们不需要再作为{{3}中的类的整点进行同步是原则上可以使用它们而无需额外的同步。

即使您 处于需要同步的情况,我也不会使用MyClass.class这样做 - 这是其他代码可能决定同步的引用,所以你不能再真正推理你的代码了。我会写(再次,只有AtomicInteger由于某种原因不够好):

public class MyClass {
  private static final Object countLock = new Object();
  private static int count = 0;

  public MyClass() {
    synchronized(countLock) {
      count++;
    }
    ...
  }
}

(在这种情况下,您还希望在访问countLock的任何其他位置count进行同步,即使只是为了阅读。)

答案 1 :(得分:1)

某种同步是必要的,这是可行的,是的。它将完成与同步静态方法相同的操作。您可以考虑使用AtomicInteger代替。

答案 2 :(得分:1)

对于这种情况,我建议使用AtomicInteger