次のコードがデッドロックを引き起こさないのはなぜですか?
マルチスレッドプログラミングについての私の限られた理解から、getBar1()
が呼び出されるsharedBuffer
と「ロック」されるため、メソッドがを呼び出そうとするとgetBar2()
、スレッドは待機する必要がありますsharedBuffer
(これはそれ自体で保持されます!)。つまり、has(およびreleased )getBar2()
になるまで戻ることはできません。ただ一方で、帰ってくるのを待っているので帰れません。getBar1()
sharedBuffer
getBar1()
getBar2()
==>デッドロック。(しかし、実際にはそうではないので、私は混乱しています)
...
Foo sharedBuffer = new Foo();
Bar1 getBar1()
{
Bar1 bar1;
synchronized (sharedBuffer)
{
bar1 = sharedBuffer.getBar1();
if (bar1 == null)
bar1 = new Bar1(sharedBuffer, getBat2());
sharedBuffer.setBar1(bar1);
}
return bar1;
}
Bar2 getBar2()
{
Bar2 bar2;
synchronized (sharedBuffer)
{
bar2 = sharedBuffer.getBar2();
if (bar2 == null)
bar2 = new Bar2();
}
return bar2;
}
...