2012-06-10 70 views
2

说当前线程持有锁,然后在同一线程再次调用会导致死锁?

synchronize(lock) 

,就会死锁发生?

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

+3

如何使用Google搜索一下? –

回答

8

documentation

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

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(),因为锁已被占用。

底线:锁是通过线程进行的,而不是通过代码的方法/块进行的。并且获得同一个线程已经获得的锁定是没有任何操作的。

0

objectlock 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. 

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