美文网首页
哲学家问题死锁

哲学家问题死锁

作者: YAOPRINCESS | 来源:发表于2020-09-15 20:18 被阅读0次
image.png
package com.kang.multithread;

import lombok.SneakyThrows;

/**
 * @author klr
 * @create 2020-09-15-19:58
 */

//哲学家问题
public class TestDeadLock {

    public static void main(String[] args) {
        Chopstick c1 = new Chopstick("1");
        Chopstick c2 = new Chopstick("2");
        Chopstick c3 = new Chopstick("3");
        Chopstick c4 = new Chopstick("4");
        Chopstick c5 = new Chopstick("5");

        new Philosopher("苏格拉底",c1,c2).start();
        new Philosopher("柏拉图",c2,c3).start();
        new Philosopher("亚里士多德",c3,c4).start();
        new Philosopher("赫拉克利特",c4,c5).start();
        new Philosopher("阿基米德",c5,c1).start();


    }
}

class Chopstick{
    private String name;

    public Chopstick(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Philosopher extends Thread {

    String name;
    Chopstick left;
    Chopstick right;

    public Philosopher(String name, Chopstick left, Chopstick right) {
        super(name);
        this.name=name;
        this.left = left;
        this.right = right;
    }

    @SneakyThrows
    @Override
    public void run() {
        while (true) {
            synchronized (left) {
                synchronized (right) {
                    //获取了两个筷子后才能吃饭
                    eat();
                }
            }
        }
    }

    public void eat() throws InterruptedException {
        System.out.println("eating..."+name);
        Thread.sleep(1000);
    }
}

解决方法

1.改变拿筷子的次序
c1,c2/c1,c5
这样做后有的线程得到锁的机会就少了

2.使用reentrantlock
这样获取锁失败并不会进入阻塞队列等待,而是直接跳过

package com.kang.multithread;

import lombok.SneakyThrows;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author klr
 * @create 2020-09-15-19:58
 */

//哲学家问题
public class TestDeadLock {

    public static void main(String[] args) {
        Chopstick c1 = new Chopstick("1");
        Chopstick c2 = new Chopstick("2");
        Chopstick c3 = new Chopstick("3");
        Chopstick c4 = new Chopstick("4");
        Chopstick c5 = new Chopstick("5");

        new Philosopher("苏格拉底",c1,c2).start();
        new Philosopher("柏拉图",c2,c3).start();
        new Philosopher("亚里士多德",c3,c4).start();
        new Philosopher("赫拉克利特",c4,c5).start();
        new Philosopher("阿基米德",c5,c1).start();


    }
}

class Chopstick extends ReentrantLock {
    private String name;

    public Chopstick(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Philosopher extends Thread {

    String name;
    Chopstick left;
    Chopstick right;

    public Philosopher(String name, Chopstick left, Chopstick right) {
        super(name);
        this.name=name;
        this.left = left;
        this.right = right;
    }

    @SneakyThrows
    @Override
    public void run() {
        while (true) {
//            synchronized (left) {
//                synchronized (right) {
//                    //获取了两个筷子后才能吃饭
//                    eat();
//                }
//            }
            //尝试获取左筷子
            if (left.tryLock()) {
                try {
                    //尝试获取右筷子
                    if (right.tryLock()) {
                        try {
                            eat();
                        }
                        finally {
                            right.unlock();
                        }
                    }
                }
                finally {
                    left.unlock();//释放左筷子
                }
            }
        }
    }

    public void eat() throws InterruptedException {
        System.out.println("eating..."+name);
        Thread.sleep(1000);
    }
}

相关文章

  • 五个哲学家就餐----死锁问题

    五个哲学家就餐----死锁问题

  • Java线程-死锁(十)

    一、死锁概述 关于死锁,我们可以从哲学家用餐问题说起(该例子来自《Java并发编程实战》)。   话说5个哲学家去...

  • 哲学家问题死锁

    解决方法 1.改变拿筷子的次序c1,c2/c1,c5这样做后有的线程得到锁的机会就少了 2.使用reentrant...

  • Java并发编程实战系列10之避免活跃性危险

    10.1 死锁 哲学家问题 有环 A等B,B等A 数据库往往可以检测和解决死锁//TODO JVM不行,一旦死锁只...

  • Java 死锁分类

    1. 死锁简介 经典的“哲学家进餐”问题很好的描述了死锁的情况。5个哲学家吃中餐,坐在一张圆桌上,有5根筷子,每个...

  • 哲学家进餐问题

    哲学家进餐问题是著名的死锁问题,5个哲学家,5根筷子,每个哲学家进餐需要获得左右两根筷子才可以; 信号量 使用信号...

  • 哲学家就餐问题与死锁总结

    死锁的四个条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞...

  • 多线程-哲学家进餐的3种写法

    这道题本质上其实是想考察如何避免死锁。因为当 5 个哲学家都拿着其左边(或右边)的叉子时,会进入死锁。 死锁的 4...

  • 线程同步导致的问题死锁哲学家进餐问题

    请关注我的微信公众号 个人微信公众号 技术交流群 (仅作技术交流):642646237 ​请关注我的头条号: 线程...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

网友评论

      本文标题:哲学家问题死锁

      本文链接:https://www.haomeiwen.com/subject/umxqyktx.html