簡體   English   中英

一個線程完成后會釋放一個鎖嗎?

[英]Does a thread release a lock when it finishes?

我已經閱讀了以下內容:獲取一個Lock對象並不是很好的編程習慣,而不會將代碼包含在try...finally塊中,因此即使拋出異常也可以釋放鎖定。

這可能聽起來像一個簡單的問題:當線程完成時,屬於線程的所有鎖是否會自動釋放?

我問這個問題的原因是我正在處理的程序是這樣的,一旦一個線程獲得一個鎖,它應該沒有理由讓它一直運行直到它完成。 另外,我是新手使用鎖,所以我想知道是否有任何陷阱我可能沒有考慮過。 我是否必須擔心在線程完成之前在代碼中顯式釋放鎖定,或者我是否可以將其保留給JVM,相信一旦知道其他線程在所有活動線程的鎖定上被阻止將在活動時立即激活線程停止?

簡單測試可能會顯示在線程終止時未釋放鎖定:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {
    public static void main(String[] args) {
        final Lock l = new ReentrantLock();

        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread()+": Acquire lock");
                l.lock();
                System.out.println(Thread.currentThread()+": Lock aquired: wait");
                LockSupport.parkNanos(1_000_000_000);
                System.out.println(Thread.currentThread()+"; Exiting");
            }
        };
        t.start();
        LockSupport.parkNanos(500_000_000);
        System.out.println(Thread.currentThread()+": Acquire lock");
        l.lock();
        System.out.println(Thread.currentThread()+"; Success!");
    }
}

輸出:

Thread[Thread-0,5,main]: Acquire lock
Thread[Thread-0,5,main]: Lock aquired: wait
Thread[main,5,main]: Acquire lock
Thread[Thread-0,5,main]; Exiting
// "Success" is never written: stuck in dead-lock

因此當單獨的線程獲得鎖定,然后退出時,主線程無法進行鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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