2012-06-10 217 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. 

但是沒有其他的線程將能夠訪問這個對象的同步化塊,直到當前的鍵持有線程,放開鍵。