如果线程T1通过获取类级别锁进入方法m1,这是否意味着另一个线程T2无法通过获取对象级别锁来运行其他方法m2?

最佳答案

不,这并不意味着。 “类级别锁”只是对另一个对象SomeClass.class的常规锁。 “对象级别锁定”锁定在this上。

编辑:为了确保我对您的术语有所了解,您想知道m1和m2是否可以按以下定义同时运行:

public class SomeClass {
    public synchronized static void m1() {
       //do something
    }

    public synchronized void m2() {
       //do something
    }
}

答案是肯定的,m1和m2可以同时运行。它在功能上等效于此:
public class SomeClass {
    public static void m1() {
        synchronized (SomeClass.class) {
           //do something
        }
    }
    public void m2() {
        synchronized (this) {
           //do something
        }
    }
}

由于它们在完全不同的对象上进行同步,因此它们不是互斥的。

09-25 21:13