2011-12-19 13 views
1

私には2つの方法があります。別の同期メソッド内で同期メソッドを参照する

両方ともメソッド同期です。別のメソッドから1つのメソッドを呼び出すと、それはデッドロック状態になりますか?

+1

2つのメソッドが同じクラスに属していますか? – unholysampler

+0

これはロックオブジェクトに依存します。インスタンスメソッド、静的メソッド、内部同期ブロックを持つメソッドなど、何を意味するのかについて詳しく説明できますか? – Thomas

答えて

4

いいえ、両方のメソッドが同じクラスにあるとします(また、staticまたは両方がstaticではない)。​​メソッドは、入力しようとするスレッドがモニタオブジェクトを保持できる場合にのみ入力されます(例:this)。スレッドは既にモニターを取得しているので、それはさらに問題なく2番目のメソッドに簡単に入ることができます。

+0

これはリエントラントロックと呼ばれています。 – toto2

0

Aでロックを取得し、Bをロックしたい場合。 Thread 2にはBのロックがあり、Aにもロックが必要です。 これはデッドロックです。 これ以外のことはすべて可能です。

0

は異なり:

  • をこれら2つ(またはそれ以上)の異なるオブジェクト、
  • 複数のスレッドがこれらのオブジェクトにアクセスする場合、
  • にこれらのオブジェクトのロック順序を変えることができる場合の方法を同期している場合(あるケースではobject1-> object2と他のケースのobject2-> object1)

はい、デッドロックが発生する可能性があります。

しかし、同じオブジェクトの同期されたメソッドについて話している場合、デッドロックを取得することはできません。オブジェクトのモニタはリエントラントです。既に保持している場合は、再度モニタを要求できます(同じオブジェクトに同期ブロックを入力します)。

関連する問題