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,正在吃饭");
            }
        }
    }
}
相关推荐
(Charon)几秒前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
青 春 记 忆2 分钟前
零基础入门python69:为 FastAPI 项目构建可复现 Docker 镜像
python·fastapi·后端开发
<花开花落>5 分钟前
Python 项目迁移到 uv:经验小结与可复用工作流
python·uv
databook8 分钟前
正态分布撒谎时:用柯西分布捕捉生活中的“黑天鹅”
python·数据挖掘·数据分析
Java后端的Ai之路11 分钟前
LangChain Deep Agents 从入门到企业实战
开发语言·人工智能·python·langchain·deepagents
2601_9623815812 分钟前
Mac和Windows,哪种电脑适合新手学Python|数智码力分享
windows·python·mac·编程环境·学习入门
小刘在重生~14 分钟前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list
会飞的拖把15 分钟前
Python文件操作详解:从文件读写到os、shutil模块实战
开发语言·python
RS迷途小书童20 分钟前
Python 解析大疆无人机 SRT 字幕日志
开发语言·python·无人机
我不会起名字32230 分钟前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈