Java同步和静态同步方法访问静态字段

Ume*_*cha 0 java synchronization

以下程序的行为是什么,静态同步方法和实例同步方法试图在不同的线程中访问同一类的静态字段?任何线程都会被阻止吗?它非常令人困惑.

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
        }
}
Run Code Online (Sandbox Code Playgroud)

kha*_*hik 6

同步实例方法相当于

public void m1() {
    synchronized(this) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

(嗯,它们并不完全相同,但你的问题的答案并没有受到这种差异的影响).

同步静态方法在类上同步:

public void m2() {
    synchronized(MyClass.class) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,两个块在差异对象m1上同步:在调用它的实例上m2同步,并在其实例上同步Class<MyClass>,表示JVM中的类.因此可以调用这两种方法而不会相互阻塞.