user5047085:
我々はオブジェクトfooを持っていると言います。
class Foo(){
public synchronized void instanceMethod(){}
}
var foo = new Foo();
私はFOOをロックしている場合:
synchronized(foo){
foo.instanceMethod();
}
私はまた、上のロックなければならないのinstanceMethod()
呼び出しを?質問をする別の方法-私がfooをロックしている場合は、別のスレッドコール(同時に)foo.instanceMethod()できますか?
TJクラウダー:
私がfooをロックしている場合は、別のスレッドがfoo.instanceMethod()を呼び出すことができますか?
彼らはそれを呼び出すことができますが、実行はあなたのブロックを離れるまで通話が待機しますsynchronized
上のfoo
ため、instanceMethod
ですsynchronized
。インスタンスメソッドを宣言するsynchronized
略ブロックにその全体体を置くと同じであるsynchronized
オンthis
。
場合はinstanceMethod
いなかった同期、そしてもちろん通話が待機しないでしょう。
注意は、しかし、ことをsynchronized
あなたが示されてきたブロックは不要です。
synchronized(foo){ // <==== Unnecessary
foo.instanceMethod();
}
のでinstanceMethod
ありsynchronized
、それはちょうどすることができます:
foo.instanceMethod();
...だけでなくブロックで何か他のものがありますしない限り。