@Christian_IT_Engineer

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

同一スレッドにて同一インスタンスをsynchronizedするとデッドロックするのか?

解決したいこと

Java SE11のsynchronizedを使ったプログラムのデバッグ業務で解析に苦労しています。
以下の例ようなロジックを組むと、デッドロックが起きるのでしょうか?
あるいは、同一スレッドで同一インスタンスに対してロックを取得した場合は、待ちは発生せずデッドロックは起きないのでしょうか?

また、このような動作検証を単体試験レベルで手軽に動作確認する良い方法があれば教えていただけませんか?

synchronized構文を使ったソースコード例

public class SomeClass{
 Map<String, Object> map = new HashMap<String, Object>();

 public static void main {
   map.put("hoo", "hoge");
   methodA();
 }
 
 public void methodA(){
  synchronized(map.get("hoo")){
   methodA();
  }
 }
}

methodAが再帰的に呼び出されているので、2回目のmethodA呼び出しのsynchronizedで排他ロックを取得できず、待ち状態が発生し、デッドロックするのかと予想しましたが、実際のところはどうなるのでしょうか?
実際に業務で使用しているプログラムはもっと複雑ですが、上記の単純化が正しければ、これでデッドロックしていないような挙動をしているように見える動きをします。Javaが提供するsynchronizedが、同一スレッドにて同一インスタンスに対してはデッドロックを起こさないような仕様なのかな、と思いましたが、その裏付けを取るのに苦労しています。

Javaに詳しい方、ご教示いただけると大変助かります。
よろしくお願いします。

0 likes

2Answer

同一スレッドにて同一インスタンスに対してはデッドロックを起こさないような仕様なのかな

Java には詳しくありませんが、言語仕様にはそう書いてあるようです。

The most basic of these methods is synchronization, which is implemented using monitors. Each object in Java is associated with a monitor, which a thread can lock or unlock. Only one thread at a time may hold a lock on a monitor. Any other threads attempting to lock that monitor are blocked until they can obtain a lock on that monitor. A thread t may lock a particular monitor multiple times; each unlock reverses the effect of one lock operation. (強調引用者)

要約すると、同一スレッドは同一インスタンスを対象に重ねて何回でもロックでき、同じ回数のアンロック操作を要します。

1Like

Comments

  1. ご回答ありがとうございます。大変助かりました!

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌