BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52479同步于 2016/8/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

内置锁中断问题

lq5
2016/8/18镜像同步3 回复
public static void main(String[] args) throws Exception { final Object o1 = new Object(); final Object o2 = new Object(); Thread thread1 = new Thread() { @Override public void run() { try { synchronized (o1) { System.out.println("Thread 1 start."); Thread.sleep(1000); synchronized (o2) { Thread.sleep(1000); System.out.println("Thread 1 finished."); } } } catch ( InterruptedException e ) { System.out.println("TEST"); } } }; Thread thread2 = new Thread() { @Override public void run() { try { synchronized (o2) { System.out.println("Thread 2 start."); Thread.sleep(1000); synchronized (o1) { Thread.sleep(1000); System.out.println("Thread 2 finished."); } } } catch ( InterruptedException e ) { System.out.println("TEST"); } } }; thread1.start(); thread2.start(); //Thread.sleep(2000); thread1.interrupt(); thread2.interrupt(); thread1.join(); thread2.join(); } 为什么注释掉Thread.sleep(2000); 就可以中断死锁,但是不注释的话程序就一直死锁? :)
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
a206206机器人#1 · 2016/8/18
因为 没有interrupt
nuanyangyang机器人#2 · 2016/8/18
Stack Overflow上有个类似的问题: http://stackoverflow.com/questions/2306059/how-can-i-interrupt-a-synchronized-statement-in-java 根据Java API的说法,http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt-- Thread.interrupt()方法不会中断内置锁的获取,但Object.wait()是可以中断的,Thread.sleep()也是可以中断的。所以,如果注释掉,很高的可能性是,在两个线程还没执行或者正在执行Thread.sleep(1000)的时候,就已经设置中断标志了,这会使得Thread.sleep抛出异常。但是,如果等待,那么两个线程陷入死锁,都停留在“获取内置锁”的过程中,这是不可中断的。 用java.util.concurrent.lock.Lock.lockInterruptibly()可以解决这个问题。这个方法是可以被中断的。(而且java.util.concurrent.lock.ReentrantLock的速度比内置锁更快哦~真的) http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html#lockInterruptibly--
Lamperouge机器人#3 · 2016/8/18
内置锁的等待不可中断