写一个多线程死锁的例子
public class DeadLockDemo {
public static final String lockA = "locka";
public static final String lockB = "lockb";
public void methodA() throws InterruptedException {
synchronized (lockA){
System.out.println("获取线程B方法"+Thread.currentThread().getName());
//释放cup资源 但不释放锁
Thread.sleep(200);
synchronized (lockB){
System.out.println("获取线程A方法"+Thread.currentThread().getName());
}
}
}
public void methodB() throws InterruptedException {
synchronized (lockB){
System.out.println("获取线程A方法"+Thread.currentThread().getName());
Thread.sleep(200);
synchronized (lockA){
System.out.println("获取线程B方法"+Thread.currentThread().getName());
}
}
}
public static void main(String[] args) {
DeadLockDemo deadLockDemo = new DeadLockDemo();
new Thread(()-> {
try {
deadLockDemo.methodA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()-> {
try {
deadLockDemo.methodB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println("主线程运行结束"+Thread.currentThread().getName());
}
复制代码
发生死锁的原因
线程在获得了锁A并且没有释放的情况下去申请锁B,
这时另⼀个线程已经获得了锁B,在释放锁B之前⼜要先获得锁A
因此闭环发⽣,陷⼊死锁循环
死锁的4个必要条件
互斥条件:资源不能共享,只能由⼀个线程使⽤
请求与保持条件:线程已经获得⼀些资源,但因请求其他资源发⽣阻塞,对已经获得的资源保持不释
放
不可抢占:有些资源是不可强占的,当某个线程获得这个资源后,系统不能强⾏回收,只能由线程使
⽤完⾃⼰释放
循环等待条件:多个线程形成环形链,每个都占⽤对⽅申请的下个资源
只要发⽣死锁,上⾯的条件都成⽴;只要⼀个不满⾜,就不会发⽣死锁
复制代码
如何解决上面代码的死锁问题
public class DeadLockDemo {
public static final String lockA = "locka";
public static final String lockB = "lockb";
public void methodA() throws InterruptedException {
synchronized (lockA){
System.out.println("获取线程B方法"+Thread.currentThread().getName());
//释放cup资源 但不释放锁
Thread.sleep(200);
}
synchronized (lockB){
System.out.println("获取线程A方法"+Thread.currentThread().getName());
}
}
public void methodB() throws InterruptedException {
synchronized (lockB){
System.out.println("获取线程A方法"+Thread.currentThread().getName());
Thread.sleep(200);
}
synchronized (lockA){
System.out.println("获取线程B方法"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
DeadLockDemo deadLockDemo = new DeadLockDemo();
new Thread(()-> {
try {
deadLockDemo.methodA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()-> {
try {
deadLockDemo.methodB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println("主线程运行结束"+Thread.currentThread().getName());
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END