我很好奇以下的效果會是什麼:從同步子句中重新分配同步對象?
Object mutex;
... // mutex initialized in constructor etc.
public setMutex(Object mutex) {
synchronized(this.mutex) {
this.mutex = mutex;
}
}
我已經看到了類似的問題提供諮詢意見提出針對具體做其他語言這種東西,但沒有爲Java。我還看到了很多關於爲什麼人們可能想要這樣做的問題,因爲它似乎是自我毀滅的代碼。
我的理由是,我的代碼的其它關鍵部分,可以使用互斥時setMutex()被調用,我不想互斥重新分配,直到這些關鍵部分已經退出。所以它並不是爲了防止設置互斥體的競爭條件,因爲它保持了互斥體所保護的完整性。我希望是有道理的:)
我個人認爲它應該工作得很好,但我真的不知道。
編輯:從去除方法簽名的「同步」的關鍵詞...穆斯塔而我打字brainfartet。
一個良好的IDE(Netbeans的),甚至會報告警告,「在非最終場同步」,所以最好以紀念場,並最終以避免意外分配給它。 – 2011-01-27 06:41:55
得到了警告(intellij),但它仍然偶爾需要重新分配同步對象。但是,它通常是一個錯誤。 – Nick 2011-01-29 04:30:03
在方法上使用`synchronized`,而不是在對象上。 – 2013-08-10 07:47:33