8

Javaマルチスレッドでの「プライベート最終オブジェクト」ロックの使用は何ですか?

私の理解によると、クラスをスレッドセーフにするためには、すべてのメソッドを同期済みとしてマークする組み込みロックを使用し、「this」を使用してオブジェクトのモニターでロックする必要があると思いますか? または、クラスの「this」で同期されているとマークされているメソッドを、メソッド内のプライベート最終オブジェクト ロックに置き換えて、汎用オブジェクト ロックをロックして、スレッド セーフにすることができますか?

組み込みロックを使用するコードの例:

public class Counter{

 // Locks on the object's monitor
 public synchronized void changeValue() { 
   // ...
 }

}

上記のコードを次の外部ロックに置き換えることができます。

public class Counter{
 private final Object lock = new Object(); // private final lock object

  public void changeValue() {
   synchronized (lock) { // Locks on the private Object
  // ...
       }
  }
}

上記のように、組み込みロックを使用するのではなく、外部ロックを使用してクラスをスレッドセーフにすることをお勧めしますか? ここで私の理解が間違っている場合は修正してください。

4

3 に答える 3

0

以下の例は、いつ使用するかを明確にします。

public class Foo {
    // Locks on the object's monitor
    public synchronized void changeValue() {
        // ...
    }
    public static Foo changeState(String name) {
        // Manipulate on Foo 
        return obj;
    }
    public static void main(String[] args) throws InterruptedException {
        // Untrusted code
        String name = "test" ;
        Foo foo = Foo.changeState(name);
        if (foo == null) {
            throw new IllegalStateException();
        }
        synchronized (foo) {
            while (true) {
                // Indefinitely lock someObject
                Thread.sleep(Integer.MAX_VALUE);
            }
        }
    }
}
于 2020-06-06T14:22:23.433 に答える