重新认识Java中的死锁问题

news2024/11/20 3:37:57

一、定义

多个进程因抢夺系统资源而产生相互等待的现象。

二、场景模拟

package com.gui.practise.thread.deadlock;

public class DeadLock {
    private final Object resource1 = new Object();//资源 1    
    private final Object resource2 = new Object();//资源 2    
    public void leftRight() {
        synchronized (resource1) {
            System.out.println(Thread.currentThread() + "get resource1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread() + "waiting get resource2");

            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
            }
        }
    }

    public void rightLeft() {
        synchronized (resource2) {
            System.out.println(Thread.currentThread() + "get resource2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread() + "waiting get resource1");

            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
            }
        }
    }
}
package com.gui.practise.thread.deadlock;

public class DeadLockTest {
    public static void main(String[] args) {
        DeadLock dl = new DeadLock();
        new Thread(() -> {
            dl.leftRight();
        }, "线程 1").start();

        new Thread(() -> {
            dl.rightLeft();
        }, "线程 2").start();
    }
}

三、死锁检测

Java自带工具检测死锁

第一步:jps找到对应进程

第二步:jstack查看对应堆栈信息

阿里巴巴开源的java诊断工具arthas

下载地址:https://github.com/alibaba/arthas/releases

四、特点&预防&解除

特点
  • 互斥(多个线程不能同时使用一个资源)
  • 不可剥夺(资源请求者不能强制从资源占有者手中抢夺资源,资源只能由占有者主动释放)
  • 持有并等待(当资源请求者在请求其他资源的同时保持对原有资源的占有)
  • 环路(多个线程存在环路的锁依赖关系而永远等待下去)
预防
  • 能无锁开发就无锁开发
  • 如果确实需要使用锁,核心原则:资源有序分配法(各个线程总是以相同的顺序申请自己想要的资源)
  • 合理的锁顺序
  • 更小的锁范围
  • 使用定时锁,比如Lock类中的tryLock方法
解除
  • 直接重启服务,如果代码未进行修复,问题还会出现
  • 使用定时锁方案,Lock的tryLock方法

五、使用资源有序分配法解除场景模拟中的死锁问题

package com.gui.practise.thread.deadlock;

public class DeadLock {
    private final Object resource1 = new Object();//资源 1    
    private final Object resource2 = new Object();//资源 2    
    public void leftRight() {
        synchronized (resource1) {
            System.out.println(Thread.currentThread() + "get resource1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread() + "waiting get resource2");

            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
            }
        }
    }

    public void rightLeft() {
        synchronized (resource1) {
            System.out.println(Thread.currentThread() + "get resource1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread() + "waiting get resource2");

            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、8086

1、三大总线: (1)基础: 地址总线、数据总线、控制总线 (2)例题: 2、8086CPU (1)通用寄存器: 数据寄存器: 指针寄存器和变址寄存器&#xff1a…

Goland设置头注释

package ${GO_PACKAGE_NAME} * Author: 坐公交也用券 * HomePage: https://liumou.site * File: ${NAME}.go * Date: ${DATE} ${TIME} * Des: 文件作用

elsarticle class not displaying email addresses

See https://tex.stackexchange.com/questions/84573/elsarticle-class-not-displaying-email-addresses

十一、DS18B20温度传感器

十一、DS18B20温度传感器 介绍单总线模块代码DS18B20模块代码温度读取主函数温度报警器主函数 介绍 单总线时序结构 初始化:主机将总线拉低至少480us,然后释放总线,等待15~ 60us后,存在的从机会拉低总线60~240us以相应主机&#x…

零基础学前端(六)HTML+CSS实战:模仿QQ官网首页

1. 我前面已经将HTML 和 CSS讲解完成,希望初学者是跟着一步一步敲代码走过来的。 2. 我个人觉得先不着急进入Javascript的学习,要将前面写样式,写布局的基础打好,所以我编写了本篇模仿QQ网站首页,请认真阅读。 一、确认…

AI-Chat,一款集全网ai功能的应用(附下载链接)

AI-Chat是一款综合性的聊天机器人,集成了多种先进的模型和功能。它采用了GPT4.0、联网版GPT和清华模型等多种模型,使得其具备更强大的语言处理能力。同时,AI-Chat还融合了AI绘画模型,例如Stable Diffusion绘画、文生图、图生图、艺…

力扣刷题-链表理论基础

什么是链表 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思&a…

FPGA:卷积编码及维特比译码仿真

FPGA:卷积编码及维特比译码仿真 本篇记录一下在FPGA中完成卷积编码和维特比译码的过程,通过代码解释编码的过程和译码的过程,便于理解,同时也方便移植到其他工程中。 1. 准备工作 卷积编译码IP核—convolutionIP核和viterbiIP核…

接口测试工具详解

首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…

k8s 自动扩缩容HPA原理及adapter配置详解

大家好,我是蓝胖子,都知道,k8s拥有自动扩缩容机制HPA,我们能够通过配置针对不同的扩缩容场景进行自动扩缩容,往往初学者在面对其中繁多配置的时候会学了又忘记,今天我将会以一种不同的视角,结合…

什么是单点登录?什么又是 OAuth2.0?

对于刚开始接触身份认证的朋友对于单点登录,OAuth2.0,JWT 等等会有诸多疑惑,甚至还会问既然有了 JWT 还拿 单点登录做什么?还拿 OAuth2.0 做什么? 不知做过身份认证的 xdm 看到这里是不是感觉这句话有点迷&#xff1f…

从Python代码到诗

🐳序言 在Python社区,没有强制的编码标准,这虽然赋予了开发者更多的自由,但也导致代码风格不一致性。使得部分代码变得晦涩难懂,本文将探讨一系列的开发技巧和最佳实践,开发出优雅的Python脚本。 1、参数接…

OpenMesh 网格平滑

文章目录 一、简介二、相关参数二、实现代码三、实现效果参考资料一、简介 由于物理采样过程固有的局限性,三维扫描仪获得的网格通常是有噪声的。为了消除这种噪声,所谓的平滑算法被开发出来。这类方法有很多,OpenMesh主要为我们提供了两种平滑算法,一种是较为经典的Laplac…

dp训练题解

训练链接 CF101E 题目链接 点击打开链接 题目解法 朴素的 d p dp dp 很好写,但发现难以得到最优路径 考虑对于 ( x , y ) (x,y) (x,y) 的转移方式只有两种,可以想到用 b i t s e t bitset bitset 来维护转移,这样可以很节约空间 但我…

113双周赛

题目列表 2855. 使数组成为递增数组的最少右移次数 2856. 删除数对后的最小数组长度 2857. 统计距离为 k 的点对 2858. 可以到达每一个节点的最少边反转次数 一、使数组成为递增数组的最少右移次数 这题可以直接暴力求解,枚举出每种右移后的数组,将…

MySQL学习笔记4

客户端工具的使用: MySQL: mysql命令行工具,一般用来连接访问mysql的数据。 案例:使用mysql客户端工具连接服务器端(用户名:root;密码:123456). [rootmysql-server ~]#…

不甘于被强势厂商捆绑,中国移动未来或自研5G基站

一直以来运营商被认为只是做服务,而设备等都是由设备商提供的,甚至由于如今的设备高度复杂,设备商已承包越来越多的基站运维工作,运营商的技术水平越来越低,不过随着中国移动发布5G射频芯片8676,似乎显示出…

centos7用docker安装WireGuard教程

1、 检查centos内核版本 uname -r2、升级内核 下载脚本上传到服务器运行脚本进行升级内核 链接:https://pan.baidu.com/s/1vYmqVy2St3nFnJWGPIwdOw 提取码:owac 3、安装WireGuard 方案一:使用脚本安装 执行第二步脚本进行安装#启动wg0wg…

CSRF攻击(跨站请求伪造)

1.CSRF原理 程序员开发的时候,未对相关页面进行token和referer判断,造成攻击者可构造自己的URL地址欺骗用户进行点击 漏洞分析(低级可绕过) 通过这个可以更改密码 改为了password 中级多了referer头可以绕过 源代码 多了一个refer…