线程完成时是否释放一个锁?

我已经读过这样的地方,认为没有将代码包含在try...finally块中的情况下获取Lock对象并不是一个好的编程实践,因此即使抛出异常也可以释放锁。

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

我问这个问题的原因是,我正在处理的程序是这样的,一旦线程获得一个锁,它应该没有理由放下它直到完成。 另外,我新使用锁,所以我想知道是否有任何我可能没有考虑过的陷阱。 在线程完成之前,我是否必须担心显式释放代码中的锁,还是可以将其留给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

所以当单独的线程获得了锁,然后退出时,主线程不能锁。

链接地址: http://www.djcxy.com/p/29713.html

上一篇: Does a thread release a lock when it finishes?

下一篇: Best way to select values that start with symbols