2011-05-23 75 views
0
private static class RunningMutex {} 
    private static class ObserveMutex {} 

    private static volatile RunningMutex runningMutex = new ImportActionRunningMutex(); 
    private static volatile ObserveMutex observeMutex = new ImportActionObserveMutex(); 



    synchronized (observeMutex) {......} .... (1) 
    synchronized (runningMutex) {......} .....(2) 

讓代碼如上所述是否是一種好的做法?我目前正在重構一個不能正常工作的大代碼,並且發現了這些代碼。我想知道是否有一些替代上述代碼。將類對象作爲同步變量

+0

我不明白你的問題是什麼。你能重述嗎?或*解釋*你想達到什麼目的? – 2011-05-23 06:18:54

+1

你可以擁有任何東西。但對問題的一些解釋會很好...... – 2011-05-23 06:20:07

+0

你的代碼沒有鎖定在與該類相關的監視器上,它仍然鎖定在與instace相關的監視器上。 – Kaj 2011-05-23 06:25:05

回答

1

當你想在同一個類中隔離來自彼此的不同鎖或者當你想在不同的類中共享相同的鎖時,這並不是一種不常見的模式。爲每個不同的鎖創建指定的類並不是必須的(可以使用不同的Object實例),但是當分析線程轉儲時它會有很大幫助,因爲它將清楚哪個線程擁有哪個監視器。

危險之處在於,除非您小心,否則會產生死鎖情況(線程X鎖定監視器A,線程Y鎖定監視器B,線程X嘗試鎖定監視器B,線程Y嘗試鎖定監視器A)。

+0

所以,如果我創建兩個相同類的實例,而不是有兩個不同類的實例會有任何死鎖情況.... ??? – 2011-05-23 08:00:34

+0

是的,仍然存在死鎖的風險。總是在應用程序中使用多個鎖時,必須注意不要寫可能會產生死鎖的代碼。一個清晰的警告是如果你有一個方法使用一個監視器同步塊,另一個同步塊使用另一個監視器。 – pap 2011-05-23 09:08:39