我在一些地方读到,获得一个Lock
没有将以下代码括在 a 中的对象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!");
}
}
Output:
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
因此,当单独的线程获取锁然后退出时,主线程无法获取锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)