Java:嵌套同步块

2022-09-01 17:18:59

我在Heinz Kabutz的Java专家通讯版本之一中看到了这一点,尽管Kabutz博士的其余(实际上,所有)文章都得到了很好的解释和详细,但他似乎掩盖了这个代码在做什么,或者更重要的是,它的意义是什么:

public class SomeObject {
    private Object lock1;
    private Object lock2;

    public void doSomething() {
        synchronized(lock1) {
            synchronized(lock2) {
                // ...
            }
        }
    }
}

嵌套块的含义是什么?这对尝试的不同线程有何影响?synchronizeddoSomething()


答案 1

有2个可能的问题需要注意

  1. 如果使用等待/通知,嵌套锁很容易导致死锁。以下是原因的解释。http://tutorials.jenkov.com/java-concurrency/nested-monitor-lockout.html

  2. 人们应该警惕,如果另一种方法希望锁定相同的两个对象,它们必须始终以相同的顺序进行,否则可能会出现另一种死锁情况,如本文所述:如何避免嵌套同步和由此产生的死锁


答案 2

就其本身而言,此代码片段不会导致任何问题。但是,如果有类似这样的代码,问题可能会以死锁的形式出现;其中,我们有两个具有同步块的方法,使得对象以相反的顺序锁定 -

public void doSomething() {
    synchronized(lock1) {
        synchronized(lock2) {
            // ...
        }
    }
}

public void doOtherthing() {
    synchronized(lock2) {
        synchronized(lock1) {
            // ...
        }
    } 
}

现在,如果多个线程尝试访问这些方法,则由于嵌套的同步块,可能会出现死锁。


推荐