1

2 つの別々のスレッドからアクセスできるフィールドがあるとします。同期ロックにオブジェクトを使用しています。null同期ブロックの外側を確認できますか? 言い換えれば、これはスレッドセーフですか:

private Object sharedObject() = new Object();
private final Object sharedObjectLock() = new Object();

private void awesomeMethod() {
   if(sharedObject != null) {
      synchronized(sharedObjectLock) {
         //code the uses sharedObject
      }
   }
}
4

2 に答える 2

0

いいえ、スレッドセーフではありません。別のスレッドがフィールドを無効にした場合sharedObject、そのスレッドがその変更を確認できる保証はありません。

于 2012-06-11T21:42:11.393 に答える
0

いいえ。変数の割り当ては、チェック後、ロックを取得する前に発生する可能性があります。

一時期、シンクロナイズド ロックは高価であるという考えがありましたが、今ではそうではありません。ロックをつかむだけです。

于 2012-06-11T21:43:44.373 に答える