死锁
产生死锁的原因
不同线程分别占用着对方的同步资源不放弃,都在等待对方放弃自己需要的同步资源。
出现死锁后,不会出现异常,不会出现提示,出现死锁的线程会一直处于阻塞态,无法继续。
- 尽量避免同步的嵌套。
示例代码
/**
* @Author:xiezr
* @Creat:2021-07-12 23:57
*/
public class DeadLock {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
class Work1 implements Runnable{
@Override
public void run() {
synchronized (o1){
System.out.println(Thread.currentThread().getName() + ": 拥有同步监视器o1,等待同步监视器o2");
synchronized (o2){
System.out.println(Thread.currentThread().getName() + ": 线程1运行结束");
}
}
}
}
class Work2 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println(Thread.currentThread().getName() + ": 拥有同步监视器o2,等待同步监视器o1");
synchronized (o1){
System.out.println(Thread.currentThread().getName() + ": 线程2运行结束");
}
}
}
}
Work1 work1 = new Work1();
Work2 work2 = new Work2();
Thread t1 = new Thread(work1);
Thread t2 = new Thread(work2);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
死锁的情况:
没有出现死锁的情况: