哲学家就餐问题java实现,死锁经典案例,jconsole检测死锁,依据死锁的必要条件破坏死锁

本文通过Java实现哲学家就餐问题,揭示了死锁的现象。使用synchronized关键字导致死锁,通过jconsole检测到死锁状态。分析了死锁的四个必要条件,并提出两种解决方案:调整调用顺序以破坏请求和保持、环路等待条件,以及使用ReentrantLock破坏不可剥夺条件。然而,调整顺序可能导致饥饿现象。
摘要由CSDN通过智能技术生成

目录

问题描述

Synchronized实现方式

运行结果:产生死锁

死锁原因分析

分析工具:jconsole 检测死锁

产生死锁的原因?

死锁产生的四个必要条件?

代码分析

解决死锁方案1

调用顺序调整(破坏请求和保持、环路等待条件)

 运行结果:会产生饥饿现象

解决死锁方案2

使用ReentrantLock(破坏不可剥夺条件)


问题描述

有五位哲学家,围坐在圆桌旁。 

他们只做两件事,思考和吃饭,思考一会吃口饭,吃完饭后接着思考。

 吃饭时要用两根筷子吃,桌上共有 5 根筷子,每位哲学家左右手边各有一根筷子。 

如果筷子被身边的人拿着,自己就得等待。

Synchronized实现方式

package org.sharedmanagement;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "c.philosopherDining")//日志打印功能注解
public class PhilosopherDining {
    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();
    }
}
@Slf4j(topic = "c.Philosopher")//日志打印功能注解
class Philosopher extends Thread{
    Chopstick left;
    Chopstick right;

    public Philosopher(String name, Chopstick left, Chopstick right) {
        super(name);
        this.left = left;
        this.right = right;
    }
    
    public void eat() {
        log.debug("eating");//可以使用System.out.println();替代
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true){
            synchronized (left){
                synchronized (right){
                    eat();
                }
            }
        }
    }
}
class Chopstick{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值