簡體   English   中英

如果我從同步塊返回,鎖什么時候釋放?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM