2017-09-22 5 views
0

私は同期ガードとして機能するクラスを持っています。これは、メソッドを同期させることで行います。このクラスには、他のスレッドによって呼び出される定期的なリスナもあります。私は、このオブジェクトを同期ブロックで使用すると同期メソッドが実行されないようにするかどうか疑問に思っています。ここでの例である:synchronizedは(a)同期メソッドの同時実行を防ぎますか?

public class A { 
    MyStatefulObject o = new MyStatefulObject(); 

    public synchronized void doSomething(int a) { 
     o.someMethod(a); // o.someMethod cannot be executed concurrently 
    } 

    public Listener listener = new Listener() { 
     @Override 
     public void interfaceMethod() { 
      synchronized(A.this) { 
       A.this.o.someMethod(500); // Is this safe? 
      } 
     } 
    } 
} 
+0

はい、そうです。 * static *メソッドで* synchronized *を使用すると、*現在のクラスインスタンス*、つまり* Aです。これは全く同じモニターオブジェクトをロックします。 - more info https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

+0

基本的に 'synchronized foo(){...}'は 'foo(){synchron(これ){...}} '。 –

+1

@ oleg.cherednikあなたが提供したドキュメントは、 'this'がモニターオブジェクトとして使われているとは言いません。 – Max

答えて

0

2つのスレッドがAの同じインスタンスを有し、一つのスレッドが同じインスタンスにdoSomething()を呼び出す他のスレッドがinterfaceMethod()終了で​​ブロックまでブロックされ、listener.interfaceMethod()を呼び出す場合。

+0

これはどこに定義されていますか?私はこれを述べている文書を見つけることができません。 – Max

関連する問題