Java实现死锁

使用Java实现死锁

学习并发编程的死锁,之前在408的操作系统也学习过相关概念,今天使用Java代码自己实现了一下。

首先了解一下死锁的四个必要条件(发生死锁一定会发生下面四个情况):

互斥 (Mutual Exclusion): 资源一次只能被一个线程占用。 只有一个叉子或者叉子,不能两个人同时用
持有并等待 (Hold and Wait): 线程持有资源的同时,还在等待其他资源。 小明拿着勺子,还在等叉子
不可抢占 (No Preemption): 线程持有的资源不能被强行拿走。 勺子被小红拿了,不能抢
循环等待(Circular Wait): 线程形成环状等待。 小明等勺子 -> 小红等叉子 -> 小明等勺子(循环了!)

具体代码如下:

java 复制代码
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DeadLock {
    public static void main(String[] args) {
        table table = new table();
        new Thread(table::eat1, "小兰").start();
        new Thread(table::eat2, "小明").start();
    }

}
@Slf4j
class table{
    private final Object spoon = new Object();
    private final Object fork = new Object();

    public void eat1(){
        synchronized (this.fork){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.debug(Thread.currentThread().getName()+"先拿了fork,等待拿spoon");
            synchronized (this.spoon){
                log.debug(Thread.currentThread().getName()+"再拿了spoon,正在吃饭");
            }
        }
    }

    public void eat2(){
        synchronized(this.spoon){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.debug(Thread.currentThread().getName()+"先拿了spoon,等待拿fork");
            synchronized (this.fork){
                log.debug(Thread.currentThread().getName()+"再拿了fork,正在吃饭");
            }
        }
    }
}
相关推荐
SamChan901 分钟前
用Playwright端到端测试PDF翻译功能:Web自动化测试实战
前端·python·ai·pdf·wpf
Escalating_xu7 分钟前
【Linux】线程概念与控制:从地址空间、LWP 到 pthread_create、join、detach 与 NPTL
java·linux·redis
Lam Tang8 分钟前
APS 系列文章 09
java·代理模式
袁袁袁袁满11 分钟前
Python爬虫实战:利用巨量IP获取跨境电商数据
爬虫·python·网络爬虫·爬虫实战·跨境电商·电商爬虫
jufeng130723 分钟前
【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 4 篇】
python·时序数据库·tdengine·asyncio
努力搬砖的咸鱼28 分钟前
意图理解:让Agent从需求描述自动生成Pytest测试策略
人工智能·python·ai·单元测试·pytest·agent
evans在进步29 分钟前
LeetCode 198:打家劫舍——Java 动态规划详解
java·leetcode·动态规划
ZJU_统一阿萨姆30 分钟前
【推理优化进阶】性能实验科学:工作负载、统计显著性与尾延迟归因
开发语言·人工智能·语言模型·系统架构·vllm
2601_9563198840 分钟前
2026年下半年,量化学习要把交易认知和技术实现接起来
人工智能·python
Hhy_110743 分钟前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio