[英]When is the lock released if I return from the synchronized block?
如果我有來自同步塊的返回語句,我對釋放鎖的時間點感到困惑; 發現我已經添加了 try-finally 塊並在 finally 塊中添加了一個 sysout 打印“鎖定釋放”,但我可以清楚地看到,在打印“釋放”語句之前,第二個線程已經獲得了鎖定。 鎖什么時候釋放? 事情不會變得更糟的保證是什么?
public static int testClassLevelMonitor() throws InterruptedException {
try {
synchronized(TestLocks.class) {
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- have the lock");
Thread.currentThread().sleep(1000);
return 0;
}
} finally {
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- released the lock");
System.out.println("\n\n");
}
}
靜態塊:線程池-1-線程-1——有鎖
靜態塊:線程池-1-線程-2 -- 有鎖
靜態塊:線程池-1-線程-1——釋放鎖
靜態塊:線程池-1-線程-2——釋放鎖
synchronized
語句在Java 語言規范中指定。
SynchronizedStatement: synchronized ( Expression ) Block
- [..]
- 否則,讓
Expression
的非空值為V
。 執行線程鎖定與V
關聯的監視器。 然后執行Block
,然后有一個選擇:
- 如果
Block
執行正常完成,那么監視器被解鎖並且synchronized
語句正常完成。- 如果
Block
執行由於任何原因突然完成,那么監視器將被解鎖,並且synchronized
語句出於同樣的原因突然完成(return
突然完成)。
換句話說,鎖只持有synchronized
語句主體的長度。
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- have the lock");
Thread.currentThread().sleep(1000);
return 0;
finally
塊將在不持有鎖的情況下執行。
在持有鎖時,執行線程會將return
語句的計算結果壓入堆棧,釋放鎖,執行finally
塊,然后返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.