当其他线程正在执行此类的静态同步方法时,线程是否可以获取类的实例上的锁?

时间:2013-10-07 16:51:37

标签: java multithreading synchronization synchronized

假设我们有

class A {
    void m1() {
        synchronized (this) {
        }
        blah blah blah
        synchronized (this) {
        }
    }
}

我的疑问是执行等等等等,当前正在执行的线程中有对象o释放锁定,此时如果其他具有对象o的线程获取锁定,则会出现死锁。那么我们怎么能说我们应该尝试使用synchronized块而不是synchronized方法?

假设线程t1执行获取类级锁的静态同步方法,其他线程是否可以获取此类实例的锁以执行其他同步方法?

2 个答案:

答案 0 :(得分:2)

是。对象的同步完全独立于对象类的Class<?>对象上的同步。

答案 1 :(得分:2)

执行“blah blah blah”时,当前正在执行的线程没有任何锁定。另一个线程可能获取对象的锁定,但这不会导致死锁。第一个线程将直接阻塞,直到另一个线程释放锁。

当线程A拥有锁1时会发生死锁,但需要锁2,而线程B拥有锁2但需要锁1.这种情况在您的情况下不会发生。

类级锁是与对象实例上的锁不同的锁。因此,类级别锁定不会干扰在对象上执行其他同步方法的另一个线程。