当前位置: 首页 > article >正文

Java实现死锁

  • 使用Java实现死锁

使用Java实现死锁

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

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

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

具体代码如下:

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,正在吃饭");
            }
        }
    }
}


原文地址:https://blog.csdn.net/qq_52983535/article/details/146192044
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585903.html

相关文章:

  • windows10 清理 C 盘
  • 如何利用互联网大数据进行产品创新
  • 【含文档+PPT+源码】基于微信小程序的驾考在线学习与测试系统的设计与实现
  • 安全中心建设关键技术之态势展示
  • 一窥DeepSeek开源EPLB项目:揭开技术背后的面纱
  • Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组
  • 如何安装旧版本的Pytorch
  • 部署达梦数据库到服务器
  • 房屋交易平台设计与实现(代码+数据库+LW)
  • 静态分析技术:Jadx-GUI高级用法与模式识别
  • 202109 青少年软件编程等级考试C/C++ 三级真题答案及解析(电子学会)
  • 【Visio使用教程】
  • 探索Hyperlane:用Rust打造轻量级、高性能的Web后端框架
  • 分库分表与NewSQL数据库的区别及适用场景
  • Python 3.13实现数据未来预测功能(详细功能实现及环境搭建)
  • Java面向对象编程进阶:深入理解static、单例模式与继承
  • 在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器
  • 如何解决 Apache 直接显示 PHP 源码问题 ?
  • 前端及后端实现csv文件下载功能
  • Java高频面试之集合-12