同期コード内のオブジェクトは、メソッドから返さ

Tomer Armarnik:

私は同期するために、オブジェクトがメソッド呼び出しから返された同期ブロックを持つようにしたいです。

...
synchronized( someGetMethod() ) {
// synchronized block
}
...

「someGetMethod」が同期していることを前提としてのみ「//同期ブロック」セクションはありますか?

前もって感謝します

編集:私はコレクション(ロックへのオブジェクトのマップ)があります。「someGetMethod」のチェック、それはそれを追加してロックさせるためにそれを返しますされていない場合、オブジェクトは、地図上に存在する場合。以下の回答から、私は「someGetMethod」は上記の値を削除することができ、別のスレッドに地図の上にすでにある値を返しますが、ちょうど同期ブロックに入る前に、スイッチができることを理解しています。その結果、別のスレッドが「someGetMethod」を介して同じチェックを行い、現在は異なる結果を得ることができます...それは私が同期ブロック内から削除をしなければならないようですので、より良いオプションはありますか?

EDIT2は:あなたの助けありがとうございました。私は同様の問題を発見した- Javaは同期オブジェクトを取得するためのメソッド呼び出しを使用してブロックを同期

アンドリューTobilko:

someGetMethod() 式の結果に関連付けられたモニターがスレッドによってロックされる前に評価される式です。

14.19。synchronized文

synchronized文は、最初の式を評価することによって実行されます。その後:

  • Expressionの評価が何らかの理由で中途完了すれば、synchronized文は同じ理由で中途完了する。

  • 式の値がnullの場合それ以外の場合は、NullPointerExceptionがスローされます。

  • それ以外の場合は、式の非ヌル値はV.なりましょうザ・実行中のスレッドはブロックが実行された後V.に関連付けられたモニターをロックし、さらに次の選択が存在します。

    • ブロックの実行が正常に完了した場合、モニターのロックが解除されると、同期文は正常完了する。

    • ブロックの実行が何らかの理由で中途完了すれば、モニターのロックが解除され、synchronized文は同じ理由で中途完了する。

あなたは、同期ブロックを入力して式を評価し、その結果に関連したモニターを見ることができません。どうでしたあなたは、最初の場所でその発現を評価せずにブロックを入力してください?どのようなモニターあなたが同期するために使用したsomeGetMethod()自分自身を?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=316052&siteId=1