2011-01-27 7 views
0

私は次の効果がどうなるか興味:同期句内から同期オブジェクトを再割り当てしますか?

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

私は同様の質問が他の言語でこの種のものをやっに対してアドバイスを提起ませんが、Javaのための、具体的に何も見てきました。私はまた、自己崩壊のように見えるので、なぜこれをやりたいのかという理由についてたくさんの質問を見てきました。

私の根拠は、setMutex()が呼び出されたときに私のコードの他の重要なセクションがmutexを使用している可能性があるということです。これらの重要なセクションが終了するまでmutexを再割り当てしたくありません。だから、ミューテックスが何を保護しているかの完全性を維持しつつ、ミューテックスを設定する際の競争条件を守ることはそれほど重要ではありません。私はそれが意味をなさないことを願っています:)

個人的に私はそれがうまくいくはずだと思うが、私は本当に知りません。

EDIT:「シンクロナイズ」というキーワードをメソッドシグネチャから削除しました。

+0

良いIDE(Netbeansの)でも、「非最後のフィールドに同期する」警告を報告するを参照してください。 –

+0

には警告(intellij)がありますが、同期オブジェクトを再割り当てする必要がある場合があります。しかし、ええ、それは通常、間違いです。 – Nick

+0

オブジェクト上ではなく、メソッドに対して 'synchronized'を使用します。 –

答えて

1

本当に危険です。まず、この同期ブロックは動作をまったく変更しません。

(this.mutexに基づいて、または別の)この同期ブロックを使用している別のスレッド、おそらく別のインスタンスで同期するが、スレッドはthis.mutexフィールドを、キャッシュされたか否かに依存しないことができます。それはそこに偶然の割り当てを避けるために、最後のフィールドをマークする方が良いでしょうとして

は、volatile

+0

スレッドキャッシングのポイントを理解していれば、mutexがvolatileとマークされているとキャッシングを取り除くことになります。たぶん私はドキュメントを誤解しているかもしれませんが、同期ブロック内にアクセスされた変数はブロックへの入り口で更新されると思われます。私は戻ってそれを読んでみましょう。とにかく、 "おそらく別のインスタンスに同期する"コメントに戻って、私はあなたのポイントを参照してください。私はこれについて少し考えて、別のコメントを返すか、答えを受け入れます。ありがとう:) – Nick

+0

私はこれが最大の問題でもないと思います。スレッドT1がmutexフィールドを介して取得されたオブジェクト上でブロックされている場合、他のスレッドがどのmutexフィールドを参照していてもそのスレッドはブロックされたままです。どの時点で私は意味のある意味を理解することができません。 –

+0

が同意した - あなたが "あなたはおそらく別のインスタンスで同期する"というあなたのコメントを暗示していると思ったこと。このような音はたぶんデッドエンドでしたが、私の頭は遅いスピードで動き出しています。 – Nick

1

私はこれが意味のある目的ではないと思います。モニターに入るために "mutex"フィールドの古い値を待っている人は、元のオブジェクトを待っていて、新しい到着者は新しい値を待つでしょう。
同期プリミティブの値を変更する必要がある理由を理解できません。

+0

私はコードを変更することはできませんし、その同期オブジェクトとしての自己を使用する別のスレッドクラスYと同期する必要があるスレッドクラスXがあります。ランタイム時には、Xのインスタンスは常に変化するYのインスタンスと同期する必要があります。私はXをYに同期させることができないので、常に変化するYにXを同期させる方法を考えなければなりません。それよりも複雑ですが、それは基本的な考え方です。 – Nick

+0

いずれにせよ、私は提案されたアプローチの無駄を見始めている。 – Nick

関連する問題