2014-03-13 157 views
3

我可以在另一個塊中包含一個同步塊來同步另一個對象嗎?同步塊內同步塊

例子:

synchronized(myObjetc1){ 
    // code 
    synchronized(myObjetc2){ 
     // code   
    }   
} 

如果是這樣,不過,它是一個正確的方法還是太冒險了?

+0

當你開始嵌套同步塊時,你需要非常小心(並且評估一下使用鎖是否會更安全)。 – assylias

+0

詳細信息可以在Java併發教程中找到http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html – SubOptimal

回答

10

如果你在其他地方以相同的順序同步,那將會很好。

如果其他線程都執行以下代碼

synchronized(myObjetc2){ 
    // code 
    synchronized(myObjetc1){ 
     // code   
    }   
} 

你可能會得到一個僵局。

假設上面的變量引用了相同的對象,請考慮以下情況。第一個線程(您的代碼)鎖定顯示器myObjetc1。線程調度程序切換線程上下文。第二個線程(上面的代碼)將顯示器鎖定在myObjetc2上。線程調度程序切換線程上下文。第一個線程嘗試鎖定顯示器myObjetc2。它必須等待,因爲第二個線程有它。線程調度器切換上下文。第二個線程嘗試鎖定顯示器myObjetc1。它必須等待,因爲第一個線程有它。繁榮!僵局。

+0

'如果某個其他線程'可以解釋這是什麼意思? – Kick

+0

@Youngistan Yup,添加詳情。謝謝。 –

+1

您獲得鎖定,而不是顯示器。 – Andres

1

是的,你可以做到。

直到你遵循鎖定規則的時間,這樣做解決了你的要求,它的好。

但是,很多時候這樣的事情會引起DeadLock問題,如果做錯了。