死锁
什么是死锁?
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
什么情况下会产生死锁?
这里我们使用的是Lambda的写法
Coding:
package 多线程.ThreadDemo09_死锁;
public class Demo {
public static void main(String[] args) {
Object objA = new Object();
Object objB = new Object();
new Thread(()->{
while(true){
synchronized (objA){
//线程一
synchronized (objB){
System.out.println("小康同学正在走路");
}
}
}
}).start();
new Thread(()->{
while(true){
synchronized (objB){
//线程二
synchronized (objA){
System.out.println("小薇同学正在走路");
}
}
}
}).start();
}
}
显然,假设 线程一 先获取了CPU资源,代码运行到第10行,线程一发现objA锁是开的,则进去,objA锁上,然后时间片到,CPU使用权切换到 线程二 ,代码运行到第21行,线程二发现objB是开的,则进去,objB锁上,此时死锁发生!(即objA锁 与 objB锁同时锁上了)
代码常规写法(不使用Lambda)
Coding:
public class MyRunnable implements Runnable{
Object a = new Object();
Object b = new Object();
@Override
public void run() {
if ("小明".equals(Thread.currentThread().getName())) {
while(true) {
synchronized (a) {
synchronized (b) {
System.out.println(Thread.currentThread().getName() + "正在走路");
}
}
}
}
if ("小红".equals(Thread.currentThread().getName())) {
while(true) {
synchronized (b) {
synchronized (a) {
System.out.println(Thread.currentThread().getName() + "正在走路");
}
}
}
}
}
}
public class Demo2 {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
t1.setName("小明");
t2.setName("小红");
t1.start();
t2.start();
}
}
如何解决?
其中一种方法就是引入 生产者与消费者问题