返回信息流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); 就可以中断死锁,但是不注释的话程序就一直死锁?
:)
这是一条镜像帖。来源:北邮人论坛 / java / #52479同步于 2016/8/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
内置锁中断问题
lq5
2016/8/18镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
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--