如果静态同步方法和实例同步方法尝试在不同线程中访问同一类的静态字段,以下程序的行为会是什么?任何线程都会被阻塞吗?这非常令人困惑。
class MyClass
{
public static int i = 5;
public synchronized void m1()
{
System.out.println(i); //uses static field i of MyClass
//T1 is executing this method
}
public static synchronized void m3()
{
//T2 will be able to call this method on same object lock while it is using
//static field i???
System.out.println(i);//uses static field i of MyClass
}
}
最佳答案
同步实例方法相当于
public void m1() {
synchronized(this) {
...
}
}
(嗯,它们并不完全相同,但您问题的答案不会受到这种差异的影响)。
同步静态方法在类上同步:
public void m2() {
synchronized(MyClass.class) {
...
}
}
如您所见,两个 block 在不同对象上同步:m1
在调用它的实例上同步,并且 m2
在 Class<MyClass>
的实例上同步它代表 JVM 中的类。所以这两个方法可以被调用而不会互相阻塞。
关于Java同步和访问静态字段的静态同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250201/