哲学家就餐问题解决、死锁的追踪

    技术2025-07-26  12

    文章目录

    哲学家就餐问题及死锁的追踪用ReentrantLock解决哲学家就餐问题 哲学家就餐问题体现预防死锁中破坏请求和保持,破坏不剥夺条件。 大家有兴趣可以先从看看死锁文章,了解哲学家问题的由来: 死锁

    哲学家就餐问题及死锁的追踪

    会产生死锁的代码: public class Test_Pheat { public static void main(String[] args) { Chopsticks c1=new Chopsticks("c1"); Chopsticks c2=new Chopsticks("c2"); Chopsticks c3=new Chopsticks("c3"); Chopsticks c4=new Chopsticks("c4"); Chopsticks c5=new Chopsticks("c5"); new Thread(new Philosopher("1号",c1,c2)).start(); new Thread(new Philosopher("1号",c2,c3)).start(); new Thread(new Philosopher("1号",c3,c4)).start(); new Thread(new Philosopher("1号",c4,c5)).start(); new Thread(new Philosopher("1号",c5,c1)).start(); } } class Philosopher implements Runnable{ String philosophername; Chopsticks left; Chopsticks right; public Philosopher(String philosophername,Chopsticks left, Chopsticks right) { this.left = left; this.right = right; this.philosophername = philosophername; } @Override public void run() { while (true){ synchronized (this.left){//给左边筷子加锁,拿左边的筷子 System.out.println("拿取了左边的筷子"); synchronized (this.right){//拿右边的筷子 eat(); } } } } private void eat() { System.out.println(philosophername+"拿了两支筷子,可以吃了"); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } class Chopsticks{ String chopstickname; public Chopsticks(String name) { this.chopstickname = name; } @Override public String toString() { return "chopsticks{" + "name='" + chopstickname + '\'' + '}'; } }

    使用jconsole追踪死锁

    用ReentrantLock解决哲学家就餐问题

    让class Chopsticks extends ReentrantLock用trylock试图获取锁,如果无法获取则最后释放锁(可以让别人拿到锁)。

    public class Test_Pheat { public static void main(String[] args) { Chopsticks c1=new Chopsticks("c1"); Chopsticks c2=new Chopsticks("c2"); Chopsticks c3=new Chopsticks("c3"); Chopsticks c4=new Chopsticks("c4"); Chopsticks c5=new Chopsticks("c5"); new Thread(new Philosopher("1号",c1,c2)).start(); new Thread(new Philosopher("2号",c2,c3)).start(); new Thread(new Philosopher("3号",c3,c4)).start(); new Thread(new Philosopher("4号",c4,c5)).start(); new Thread(new Philosopher("5号",c1,c5)).start(); } } class Philosopher implements Runnable{ String philosophername; Chopsticks left; Chopsticks right; public Philosopher(String philosophername,Chopsticks left, Chopsticks right) { this.left = left; this.right = right; this.philosophername = philosophername; } @Override public void run() { while (true){ try { if (left.tryLock(1, TimeUnit.SECONDS)){ try { // System.out.println(this.philosophername+"拿到左手筷子"); if (right.tryLock()){ try { eat(); }finally { right.unlock(); } } }finally { left.unlock(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } private void eat() { System.out.println(philosophername+"拿了两支筷子,可以吃了"); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } class Chopsticks extends ReentrantLock { String chopstickname; public Chopsticks(String name) { this.chopstickname = name; } @Override public String toString() { return "chopsticks{" + "name='" + chopstickname + '\'' + '}'; } }

    Processed: 0.013, SQL: 10