死锁的四个必要条件

2023-05-16

死锁在高并发中是一个常见的名词。产生的四个必要条件如下:

  1. 互斥条件:一个资源同一时间能且只能被一个线程访问;

  1. 不可掠夺:当资源被一个线程占用时,其他线程不可抢夺该资源;

  1. 请求与等待:当资源被一个线程占用时,其他线程只能等待资源的释放再拥有;

  1. 循环等待:指的是若干线程形成头尾相接的情况,将所有资源都占用导致的整体死锁或局部死锁。

图演示

线程1依次占用资源1和资源2,当尝试占用资源2时,发现该资源被线程2占用,此时只能等待线程2的释放,此时处于阻塞状态;

线程2依次占用资源2和资源1,当尝试占用资源1时,发现该资源被线程1占用,此时只能等待线程1的释放,此时处于阻塞状态。

这两个线程无限的等待对方资源的释放,则成为死锁。

代码演示

package com.lidantao.deadLock;

import java.util.concurrent.TimeUnit;

/**
 * @author Cola
 * @Date 2023年02月16日 10:41:00
 */
public class Demo {

    public static void main(String[] args) throws InterruptedException {

        Object obj1 = new Object();
        Object obj2 = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (obj1) {
                try {
                    System.out.println("====线程1尝试占用资源1====");
                    obj1.hashCode();
                    System.out.println("====线程1已经占用资源1====");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("======线程1尝试占用资源2======");
                    synchronized (obj2) {
                        obj2.hashCode();
                        System.out.println("====线程1已经占用资源2====");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程1");

        Thread t2 = new Thread(() -> {
            synchronized (obj2) {
                try {
                    System.out.println("====线程2尝试占用资源2====");
                    obj2.hashCode();
                    System.out.println("====线程2已经占用资源2====");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("======线程2尝试占用资源1======");
                    synchronized (obj1){
                        obj1.hashCode();
                        System.out.println("====线程2已经占用资源1====");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程2");

        // 启动线程
        t1.start();
        t2.start();

        // t1业务完成
        t1.join();
        System.out.println("====== t1线程业务已完成 ======");

        // t2业务完成
        t2.join();
        System.out.println("====== t2线程业务已完成 ======");

    }
}

控制台输出,两线程彼此等待资源释放,无法停止线程

经jconsole验证,线程1与线程2掠夺资源产生死锁

处理死锁

既然了解了死锁的必要条件,那么我们只要破坏其中一个条件则可避免产生死锁。

  1. 通常我们在业务中,可以设置等待时间。例如尝试占用资源时,设置等待时间,时间内未获得资源,则放弃尝试,避免程序长时间等待,占用过高的CPU资源。

  1. 尽量一次只占用一个资源,不要一次嵌套的占用多个资源,占用资源链越长,越容易产生死锁问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

死锁的四个必要条件 的相关文章

  • make: *** /lib/modules/2.6.18-164.el5/build: No such file

    错误显示 没有 lib modules 2 6 18 164 el5 build 这个目录 xff0c 确认当前内核是这个版本么 xff0c 是的话安装 kernel devel kernel headers 软件包
  • centos6下配置softap需关闭NetworkManager服务

    最近在linux上使用了 fast 150us无线网卡 在网上找了一大堆资料 找到了8188eu驱动 安装成功 在配置hostapd服务时 xff0c 老是启动不起来 xff0c 或者是启动之后别的机器连不上热点 xff0c 当我将Netw
  • 不重新编译为PHP安装MySQL模块

    当初安装PHP的源码目录我没有删除 xff0c 直接在此基础上安装 xff1a 1 进入php ext mysql xff1a cd php ext mysql 2 执行phpize命令 xff0c 这个命令一定得在php的模块目录下执行
  • Linux 下 netbeans 字体抗锯齿正解

    在netbeans安装目录找到 etc 目录下的 netbeans conf 文件 xff0c 用你喜欢的编辑器打开这个文件 xff0c 在其中加入这个选项 J Dawt useSystemAAFontSettings 61 on 这里你要
  • 如何在CentOS系统中安装字体

    以linux下安装宋体 xff0c 黑体为例 xff0c 介绍字体安装方法 xff1a 第一步 拷贝 把对应字体的的ttf文件拷到 usr share fonts 的任意目录下 xff0c 假设宋体已拷贝到 usr share fonts
  • Intel CPU简介

    现在Intel已然成了CPU的代名词 xff0c 但当年的Intel并没有现在这么风光 从1978年发布的8086到2013年的四代i7 xff0c 整整35年 xff0c 她见证了从PC到互联网 移动互联网的几次巨变 xff1b 这些年的
  • 让AndroidX86竖屏显示

    以VirtualBox为例 xff0c Android X86的下载地址可以百度搜索 这种界面非常不爽 xff0c 尤其在调试程序时 xff0c 如何才能显示成竖屏呢 xff1f 先把AndroidX86装到硬盘上 然后进行下面设置 1 完
  • Call to undefined function imagettftext()

    今天将公司官网弄到本地测试到时候 xff0c 发现验证码无法显示 xff0c 公司的官网以前是用dede做的 xff0c 找到dede中的include vdimgck php 单独运行 xff0c 没有报错 xff0c 也不显示 顺着文件
  • 在linux下安装glut包

    转自 xff1a http blog csdn net delacroix xu article details 5478429 在linux下opengl编程 xff0c 首先需要安装glut包 1 安装glut xff08 1 xff0
  • configure: error: could not find working GL library

    plib1 8 3下载地址 xff1a http pkgs fedoraproject org repo pkgs plib plib 1 8 3 tar gz de10b19dfcee5da7115ee2a69656f34c plib 1
  • 一篇关于su和sudo以及visudo的很好的介绍性文档

    一 使用 su 命令临时转换用户身份 1 su 的适用条件和威力 su命令就是转换用户的工具 xff0c 怎么理解呢 xff1f 比如我们以普通用户beinan登录的 xff0c 但要添加用户任务 xff0c 执行useradd xff0c
  • 微信公众号开发中的openid值并不是固定的

    在做微信开发时 xff0c 今天犯了一个错误 xff0c 检查了半天才检查出来 微信在向第三方推送信息时会带上一个openid 这是发送信息者的唯一标识 xff0c 看文档说是唯一标识 就以为这个id只与微信号有关 xff0c 而今天才发现
  • linux下单独编译安装Apache rewrite_module

    转自 xff1a http blog chinaunix net uid 25266990 id 145266 html Apache已经编译安装完了 xff0c 上传程序 xff0c 发现必须得用rewrite xff0c 重新上载模块
  • linux 下安装php的openssl扩展

    1 安装openssl 解压php的源码包 tar zxvf php 5 3 8 tar gz cd soft php 5 3 8 ext openssl mv config0 m4 config m4 否则报错 xff1a 找不到conf
  • php安装 出现Sorry, I cannot run apxs. ***错误解决方法

    tar zvxf php 5 1 2 tar gz cd php 5 1 2 configure prefix 61 usr local php with mysql 61 usr local mysql with apxs2 61 usr
  • linux下mysql的root密码忘记解决方

    1 xff0e 首先确认服务器出于安全的状态 xff0c 也就是没有人能够任意地连接MySQL数据库 因为在重新设置MySQL的root密码的期间 xff0c MySQL数据库完全出于没有密码保护的 状态下 xff0c 其他的用户也可以任意
  • Pandas DataFrame

    http pandas pydata org pandas docs stable api html dataframe 构造函数 方法描述DataFrame data index columns dtype copy 构造数据框 属性和数

随机推荐

  • Apache域名自动指向虚拟主机目录

    用apache做项目时 xff0c 是经常需要在httpd vhost conf文件中配置虚拟主机 xff0c 用于单独的项目 xff0c 每新开一个项目就需要重新加一个配置 xff0c 着实麻烦 xff0c apache2其实是支持在配置
  • CentOS上升级PHP5.3至PHP5.5

    最近想玩玩儿symfony2 发现自己CentOS上的PHP版本还是5 3不符合要求 xff0c 所以想升级至5 5 但是 CentOS通过yum更新的源最新版本是5 3 无法升级 xff0c 通过网上查找资料 发现 更新下yum的源后 可
  • 启动docker web服务时 虚拟机端口转发 外部无法访问

    centos 7 docker 启动了一个web服务 但是启动时 报 WARNING IPv4 forwarding is disabled Networking will not work 网上查询了下 需要做如下配置 解决办法 xff1
  • CentOS7下docker启动报Error starting daemon: Error initializing network controller: could not delete ...v

    前一天晚上强制关闭了虚拟机 CentOS7 导致早上启动docker 报Error starting daemon Error initializing network controller could not delete ve endp
  • 在ubuntu1404下安装PHP AMQP拓展 并进行docker容器封装

    有项目用到过rabbitmq 是技术负责人搭建好环境 xff0c 今天自己在本地 ubuntu 开发 xff0c 重新搞了下 xff0c 在网上查了下资料 xff0c 把安装重点记录下来 项目开发语言PHP 需要与一台rabbitmqser
  • centos7下将docker的storage 由loop-lvm 更改为 direct-lvm

    本机服务器环境是centos7 xff08 vbox虚拟机 xff09 安装docker后 运行正常 xff0c 某次强行关闭了虚拟机 导致后续docker运行不起来 xff0c 发现报错是与storage有关 xff0c 所以网上查原因是
  • ubuntu1604下添加自启动项 开机启动docker开发环境

    在win7下安装的vbox虚拟机 xff0c 虚拟机起了一个ubuntu1604作为宿主机 xff0c 安装的docker服务 通过vbox的挂载工具将win7下的程序开发目录挂载到了ubuntu下 作为共享目录 docker安装的开发环境
  • apache2自签名证书开启ssl

    生成私钥文件 需要输入密码 openssl genrsa des3 out apache key 1024 防止APACHE启动 读取私钥文件也需要输入密码 去除密码输入 openssl rsa in apache key out apac
  • alpine 下编译php5.4的源码报Invalid configuration `x86_64-linux-musl'错误

    Invalid configuration 96 x86 64 linux musl 39 system 96 musl 39 not recognized configure error bin bash 在alpine3 7上编译php
  • golang GRPC安装

    1 下载protoc编译器 https github com protocolbuffers protobuf releases 将protoc exe放到系统环境变量设置的目录下 2 安装golang相关的package go get g
  • reStructuredText

    段落 段落必须由空行代替 段落1 段落2 内联标记 span class hljs emphasis 斜体 span span class hljs strong 粗体 span span class hljs code 96 96 代码块
  • win10下安装kubernets

    win10下安装docker for windows后 xff0c 新版是有一个kubernets选项 xff0c 选择启动后 xff0c 一直报 kubernets is starting 的错误 xff0c 原因是 xff0c kube
  • 嵌入式工程师的自我修养

    文章目录 前言一 认知的四个阶段1 不知不知2 知道不知3 知道己知3 1 软硬件3 2 网络3 3 安全技术 xff08 换成你自己的领域 xff09 3 4 真正知道的三个阶段3 4 1 会用3 4 2 了解怎么实现3 4 3 明白为什
  • 利用uORB机制实现数据在不同进程中通信

    uORB实际上是一种设计模式中的观察者模式 xff0c 用于实现一种一对多的依赖关系 xff0c 让多个观察者 xff08 Observer xff09 同时监听某一主题对象 xff08 Subject xff09 当这个主题对象 xff0
  • Android-注解篇

    1 什么是注解 从JDK 5 开始 xff0c Java 增加了注解 xff0c 注解是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运 行时被读取 xff0c 并执行相应的处理 通过使用注解 xff0c 开发人员可以在不改变原
  • 新品BCM6755A1KFEBG/MT7921LE/MT7921AU WiFi芯片

    博通在WiFi市场具有相当的实力 在WiFi6上有下面这几个解决方案 xff1a 型号 xff1a BCM6755 BCM6755A1KFEBG 类型 xff1a 四核1 5GHz CPU 封装 xff1a BGA 批次 xff1a 新 B
  • Ubuntu : GPG签名验证错误 解决之道sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 6DFBCBAE

    Ubuntu GPG签名验证错误 解决之道 转载 sudo apt key adv keyserver keyserver ubuntu com recv keys Key Where key 61 61 the gpg key id Th
  • T265深度图像输出

    1 T265深度图像输出 1 1 环境依赖 T265摄像头python3pip3opencv pythonpyrealsense2 1 2 安装运行环境 安装秘钥 span class token function sudo span ap
  • Linux版本号串记录(ubuntu系列)

    Linux version 4 4 0 112 generic buildd 64 lgw01 amd64 010 gcc version 5 4 0 20160609 Ubuntu 5 4 0 6ubuntu1 16 04 5 135 U
  • 死锁的四个必要条件

    死锁 在高并发中是一个常见的名词 产生的四个必要条件如下 xff1a 互斥条件 xff1a 一个资源同一时间能且只能被一个线程访问 xff1b 不可掠夺 xff1a 当资源被一个线程占用时 xff0c 其他线程不可抢夺该资源 xff1b 请