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

Ell*_*tus 3 java multithreading constructor synchronization static-members

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

public class MyClass {
  private static int count = 0;

  public MyClass() {
    synchronized(MyClass.class) {
      count++;
    }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

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

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

  public MyClass() {
    count.incrementAndGet();
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们现在可以将变量设为final,因为该变量不会更改值,并且我们不需要再进行同步,因为java.util.concurrent.atomic中的类的整个点是它们可以原子地使用没有额外的同步.

即使您处于需要同步的情况,我也不MyClass.class会这样做 - 这是其他代码可能决定同步的参考,因此您无法再真正推断您的代码.我会写(再次,只是AtomicInteger因为某些原因不够好):

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

  public MyClass() {
    synchronized(countLock) {
      count++;
    }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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