同一スレッドにて同一インスタンスを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に詳しい方、ご教示いただけると大変助かります。
よろしくお願いします。