我可以在另一個塊中包含一個同步塊來同步另一個對象嗎?同步塊內同步塊
例子:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果是這樣,不過,它是一個正確的方法還是太冒險了?
我可以在另一個塊中包含一個同步塊來同步另一個對象嗎?同步塊內同步塊
例子:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果是這樣,不過,它是一個正確的方法還是太冒險了?
如果你在其他地方以相同的順序同步,那將會很好。
如果其他線程都執行以下代碼
synchronized(myObjetc2){
// code
synchronized(myObjetc1){
// code
}
}
你可能會得到一個僵局。
假設上面的變量引用了相同的對象,請考慮以下情況。第一個線程(您的代碼)鎖定顯示器myObjetc1
。線程調度程序切換線程上下文。第二個線程(上面的代碼)將顯示器鎖定在myObjetc2
上。線程調度程序切換線程上下文。第一個線程嘗試鎖定顯示器myObjetc2
。它必須等待,因爲第二個線程有它。線程調度器切換上下文。第二個線程嘗試鎖定顯示器myObjetc1
。它必須等待,因爲第一個線程有它。繁榮!僵局。
是的,你可以做到。
直到你遵循鎖定規則的時間,這樣做解決了你的要求,它的好。
但是,很多時候這樣的事情會引起DeadLock問題,如果做錯了。
當你開始嵌套同步塊時,你需要非常小心(並且評估一下使用鎖是否會更安全)。 – assylias
詳細信息可以在Java併發教程中找到http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html – SubOptimal