あなたがオブジェクトのロックを持っている場合は、そのすべてのメソッドをロックしているのですか?

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();

...だけでなくブロックで何か他のものがありますしない限り。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=209544&siteId=1