我知道构造函数不能在Java中同步。这是否意味着如果构造函数修改了类中的静态变量,并且如果可以从多个线程调用构造函数,那么访问需要同步,如图所示?
public class MyClass {
private static int count = 0;
public MyClass() {
synchronized(MyClass.class) {
count++;
}
...
}
}
答案 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