爲什麼下面這段代碼不會導致死鎖?爲什麼這不會導致死鎖
從我有限的多線程編程的理解,當getBar1()
叫,sharedBuffer
將被「鎖定」,因此,當方法試圖調用getBar2()
,該線程將不得不等待sharedBuffer
(由其自身持有!)。換句話說,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;
}
...
閱讀有關重入鎖的信息。那些在Java中是本地的是。 – 2013-03-15 16:44:33