2

我真的想不出任何是否有一個示例代碼,其中@synchronized會死鎖?

有一件事我能想到的是

@synchronized (self) 
{ 
@synchronized (self){} 
} 

但這不會死鎖,因爲鎖是遞歸的將只是允許同一線程去。因此,基本上可以不死鎖,如果整個程序只使用一個變量

另一個我能想到的是

@synchronized (A) 
{ 
@synchronized (B){} 
} 
在一個線程

@synchronized (B) 
{ 
@synchronized (A){} 
} 
在另一個

。我在這裏糾正?

如何避免死鎖呢?任何簡單的規則?

回答

4

我的#1規則永遠不會鎖定任何公開可見的東西。
我的#2規則永遠不會向外部代碼發出,同時持有一個鎖。

我發現如果你可以管理這兩點,任何可能出現的死鎖都容易發現,而且更容易修復。

+0

我的規則是隻使用一個且只有一個鎖,並且這對所有人都是可見的。這是另一個很好的規則。 –

+0

適用於所有人 –

1

在共享資源的情況下使用併發時,沒有什麼是簡單的;總是存在死鎖的風險,總是存在通過非原子性破壞數據的風險,並且由於所有的鎖定,完全併發啓用的代碼總是比單線程代碼慢。

「最佳」模式是隔離;使交叉線程/隊列層儘可能小,並將它背後的所有內容隔離到單個線程。

核心數據就是這種模式的一個很好的例子。被管理的對象上下文是每個線程的,CD通過一個非常好的單元測試的基礎架構來完全管理幕後的數據存儲。