以下会导致死锁吗?

时间:2012-06-10 10:12:22

标签: java multithreading

假设当前线程持有锁,然后同一线程调用

synchronize(lock)

再次,会发生僵局吗?

我依稀记得锁是同一个线程的重入,这是什么意思?

3 个答案:

答案 0 :(得分:8)

来自documentation

  

线程无法获取另一个帖子所拥有的锁定。 但是   线程可以获取它已拥有的锁。允许线程到   不止一次获得相同的锁可以重入   同步。这描述了同步代码的情况,   直接或间接调用也包含的方法   同步代码,两组代码都使用相同的锁。

答案 1 :(得分:7)

你没记错,可重入意味着同一个线程可以多次获得相同的锁,例如:

private final Object lock = new Object();

public void foo() {
    synchronized(lock) {
        bar();
    }
}

public void bar() {
    synchronized(lock) {
        //...
    }
}

按预期工作,以及(此处this用作隐式锁定对象):

public synchronized void foo() {
    bar();
}

public synchronized void bar() {
    //...
}

并且没有发生死锁。当然,其他线程不能同时访问foo()bar(),因为已经锁定了。

底线:锁是由线程而不是方法/代码块来进行的。获取同一个线程已经获得的锁是一个无操作。

答案 2 :(得分:0)

每个object都有lock and a key来保护其crucial data stateevery Class has a lock and a key也是如此,以保护其crucial static data state.

synchronized keyword on the atomic statements(方法或雾化语句)

就像锁定对象一样。当一个线程访问该方法或原子语句时, 它必须获得key for that object

Once it obtains the key, 
its free to access this synchronized method/statement
or any other synchronized method/statement of that object.
Thats what reentrant is all about.

但是没有其他线程能够访问此对象的同步块直到当前密钥保持线程,放开密钥。