一个线程完成后会释放一个锁吗?

9 java multithreading

我已经阅读了Lock以下内容:如果没有将代码包含在try...finally块中,则获取对象并不是一个好的编程习惯,因此即使抛出异常也可以释放锁.

这可能听起来像一个简单的问题:当线程完成时,属于线程的所有锁是否会自动释放?

我问这个问题的原因是我正在处理的程序是这样的,一旦一个线程获得一个锁,它应该没有理由让它一直运行直到它完成.另外,我是新手使用锁,所以我想知道是否有任何陷阱我可能没有考虑过.我必须对明确担心线程结束之前释放在我的密码锁,或者我可以离开它的JVM,有信心在一定的知识是被封锁的所有活动线程的锁其他线程将被激活,一旦激活线程停止?

Tag*_*eev 5

简单测试可能会显示在线程终止时未释放锁定:

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

因此当单独的线程获得锁定,然后退出时,主线程无法进行锁定.