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)
绝对 - 毕竟,它可能通过许多线程访问共享资源.我本人只是用一个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,即使只是为了阅读.)