我已经读过一些地方认为,获取Lock
对象而不将代码包含在try...finally
块中是不好的编程习惯,因此即使异常是,也可以释放锁定抛出。
这可能听起来像一个简单的问题:当线程完成时,属于线程的所有锁是否会自动释放?
我问这个问题的原因是我正在处理的程序是这样的,一旦一个线程获得一个锁,它应该没有理由让它一直运行直到它完成。另外,我是新手使用锁,所以我想知道是否有任何陷阱我可能没有考虑过。我是否必须担心在线程完成之前在代码中显式释放锁定,或者我是否可以将其保留给JVM,确信在活动线程锁定的所有其他线程被锁定时会立即激活线程停止?
答案 0 :(得分: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!");
}
}
输出:
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
因此当单独的线程获得锁定,然后退出时,主线程无法进行锁定。