0
点赞
收藏
分享

微信扫一扫

Java多线程编程(四)——死锁问题

死锁

什么是死锁?

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行

什么情况下会产生死锁?

 这里我们使用的是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();
    }
}

如何解决?

其中一种方法就是引入 生产者与消费者问题

举报

相关推荐

0 条评论