ReentrantLock 锁 lock 与lockInterruptibly 方法比较区别:
lock优先考虑获取锁,待获取锁成功后,才响应中断。
lockinterruptibly 优先考虑响应中断,而不是响应锁的普通获取 or 重入获取
详细区别:
ReentrantLocklockInterruptibly 允许在等待时由其他线程调用等待线程的Thread.interrupt方法来中断等待线程的等待 而直接返回,
这是不用获取锁,而会跑出一个InterruptedException。
ReentrantLock.lock方法不允许Thread.interupt中断,即使检测到Thread.isInterrupted,一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功后再把当前线程置为interrupted状态,然后再中断线程。
class MyThread extends Thread{
public void test() throws Exception{
final Lock lock=new ReentrantLock();
lock.lock();
Thread.sleep(1000);
Thread t1=new Thread(new Runnable(){
@Override
public void run() {
lock.lock();
// try {
// lock.lockInterruptibly();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
System.out.println(Thread.currentThread().getName()+" interrupted.");
}
});
t1.start();
Thread.sleep(1000);
t1.interrupt();
Thread.sleep(1000000);
}
}
使用lock方法,主程序指定test方法后,即使执行了interrupt()方法也没有反应。将注释代码取消掉,程序会要求捕捉异常
总结:
lockInterruptibly() 允许在等待时由其他线程的Thread.interrupt()方法来中断等待线程而直接返回,这时是不用获取锁的,而会抛出一个InterruptException。
ReentrantLock.lock()方法则不允许Thead.interrupt()中断,即使检测到了Thread.Interrupted一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功之后在吧当前线程置为interrupted状态。