我在java類中有兩個方法,它們都有一個使用同一對象進行同步的代碼塊。我明白,在JAVA同步方案中,線程獲取的鎖是可重入的。有了這個我可以安全地說下面的一段代碼不會在所有情況下導致任何問題?使用同步語句的可重入同步行爲
public class Someclass
{
private static final Object LCK_OBJ = new Object();
//.....
publc void method1()
{
//some code....
synchronized(LCK_OBJ)
{
//some sychronized code.
method2(..);
}
//some more code....
}
protected static final void method2(..)
{
Someclass ref = null;
//some code which gets different other references of SomeClass in a loop....
ref.method3(..);
}
publc void method3()
{
//some code....
synchronized(LCK_OBJ)
{
//some sychronized code.
}
//some more code....
}
}//end of class
謝謝Tomasz Stanczak!在輸入示例代碼時,我錯過了通過對象引用鍵入實例方法調用的方法。請耐心等待並答覆答覆。只要添加到我以前的查詢中,當某個線程當前在method2內執行(從method1調用)時,如果某個其他線程試圖執行方法1或方法3中的同步代碼,我們可以肯定地說第二個線程將被阻塞,直到第一個線程完成執行方法1,方法2和方法3? – Muthu 2011-04-26 19:00:59
是的,它會阻塞,直到釋放鎖,並且當第一個線程從method3和method2返回後離開方法1中的同步塊時會發生這種情況。 – 2011-04-27 06:47:00