2

假设当前线程持有锁,那么同一个线程调用

synchronize(lock)

再次,会发生死锁吗?

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

4

3 回答 3

8

文档

线程无法获得另一个线程拥有的锁。但是线程可以获取它已经拥有的锁。允许一个线程多次获取同一个锁可以实现重入同步。这描述了一种情况,同步代码直接或间接调用一个也包含同步代码的方法,并且两组代码都使用相同的锁。

于 2012-06-10T10:18:54.747 回答
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()同时访问,因为锁已经被占用了。

底线:锁是由线程获取的,而不是由方法/代码块获取的。并且获取已由同一线程获得的锁是无操作的。

于 2012-06-10T10:16:33.180 回答
0

每个object人都有一个lock and a key保护自己的crucial data state人,every 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.

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

于 2012-06-10T10:42:55.180 回答