私は次の効果がどうなるか興味:同期句内から同期オブジェクトを再割り当てしますか?
Object mutex;
... // mutex initialized in constructor etc.
public setMutex(Object mutex) {
synchronized(this.mutex) {
this.mutex = mutex;
}
}
私は同様の質問が他の言語でこの種のものをやっに対してアドバイスを提起ませんが、Javaのための、具体的に何も見てきました。私はまた、自己崩壊のように見えるので、なぜこれをやりたいのかという理由についてたくさんの質問を見てきました。
私の根拠は、setMutex()が呼び出されたときに私のコードの他の重要なセクションがmutexを使用している可能性があるということです。これらの重要なセクションが終了するまでmutexを再割り当てしたくありません。だから、ミューテックスが何を保護しているかの完全性を維持しつつ、ミューテックスを設定する際の競争条件を守ることはそれほど重要ではありません。私はそれが意味をなさないことを願っています:)
個人的に私はそれがうまくいくはずだと思うが、私は本当に知りません。
EDIT:「シンクロナイズ」というキーワードをメソッドシグネチャから削除しました。
良いIDE(Netbeansの)でも、「非最後のフィールドに同期する」警告を報告するを参照してください。 –
には警告(intellij)がありますが、同期オブジェクトを再割り当てする必要がある場合があります。しかし、ええ、それは通常、間違いです。 – Nick
オブジェクト上ではなく、メソッドに対して 'synchronized'を使用します。 –