2011-01-27 59 views
0

我很好奇以下的效果會是什麼:從同步子句中重新分配同步對象?

Object mutex; 
... // mutex initialized in constructor etc. 
public setMutex(Object mutex) { 
    synchronized(this.mutex) { 
     this.mutex = mutex; 
    } 
} 

我已經看到了類似的問題提供諮詢意見提出針對具體做其他語言這種東西,但沒有爲Java。我還看到了很多關於爲什麼人們可能想要這樣做的問題,因爲它似乎是自我毀滅的代碼。

我的理由是,我的代碼的其它關鍵部分,可以使用互斥時setMutex()被調用,我不想互斥重新分配,直到這些關鍵部分已經退出。所以它並不是爲了防止設置互斥體的競爭條件,因爲它保持了互斥體所保護的完整性。我希望是有道理的:)

我個人認爲它應該工作得很好,但我真的不知道。

編輯:從去除方法簽名的「同步」的關鍵詞...穆斯塔而我打字brainfartet。

+0

一個良好的IDE(Netbeans的),甚至會報告警告,「在非最終場同步」,所以最好以紀念場,並最終以避免意外分配給它。 – 2011-01-27 06:41:55

+0

得到了警告(intellij),但它仍然偶爾需要重新分配同步對象。但是,它通常是一個錯誤。 – Nick 2011-01-29 04:30:03

+0

在方法上使用`synchronized`,而不是在對象上。 – 2013-08-10 07:47:33

回答

1

那是非常危險的。首先,這個同步塊根本不會改變它的行爲。

正在使用此同步塊(或其他基於this.mutex)另一個線程,將大概同步於另一個實例,但也可以不依賴於該線程是否緩存this.mutex字段。

volatile

1

我不認爲這提供任何有意義的目的。每個等待「互斥」字段的舊值進入監視器的人都仍然在等待原始對象,新到達的人將等待新值。
不明白爲什麼你同步的原始值將需要更改。