私は同期ガードとして機能するクラスを持っています。これは、メソッドを同期させることで行います。このクラスには、他のスレッドによって呼び出される定期的なリスナもあります。私は、このオブジェクトを同期ブロックで使用すると同期メソッドが実行されないようにするかどうか疑問に思っています。ここでの例である: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?
}
}
}
}
はい、そうです。 * static *メソッドで* synchronized *を使用すると、*現在のクラスインスタンス*、つまり* Aです。これは全く同じモニターオブジェクトをロックします。 - more info https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –
基本的に 'synchronized foo(){...}'は 'foo(){synchron(これ){...}} '。 –
@ oleg.cherednikあなたが提供したドキュメントは、 'this'がモニターオブジェクトとして使われているとは言いません。 – Max