死锁
死锁的条件
互斥条件:资源不能共享,只能由一个线程使用
请求与保持条件:线程已经获得一些资源,但因请求其他资源发生阻塞,对已经获得的资源保持不释放
不可抢占:有些资源是不可强占的,当某个线程获得这个资源后,系统不能强行回收,只能由线程使用完自己释放
循环等待条件:多个线程形成环形链,每个都占用对方申请的下个资源
只要发生死锁,上面的条件都成立;只要一个不满足,就不会发生死锁
设计一个死锁的案例
package com.cx330;
public class DeadLock {
public static Object o1=new Object();
public static Object o2=new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (o1){
try {
System.out.println("t1线程获取了o1锁");
Thread.sleep(3);
synchronized (o2){
System.out.println("t1线程获取了两把锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"MyT1").start();
new Thread(()->{
synchronized (o2){
try {
System.out.println("t2线程获取了o2锁");
Thread.sleep(3);
synchronized (o1){
System.out.println("t2线程获取了两把锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"MyT2").start();
}
}
给出上边死锁代码的解决方案
package com.cx330;
public class FixDeadLock {
public static Object o1=new Object();
public static Object o2=new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (o1){
try {
System.out.println("t1线程获取了o1锁");
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (o2){
System.out.println("t1线程获取了两把锁");
}
},"MyT1").start();
new Thread(()->{
synchronized (o2){
try {
System.out.println("t2线程获取了o2锁");
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (o1){
System.out.println("t2线程获取了两把锁");
}
},"MyT2").start();
}
}