Java死锁的产生到消除

news/2024/5/20 15:56:40 标签: 死锁

首先看一个必然死锁的例子

package com.study.deadlock;

public class MustDeakLock implements Runnable {
    int flag = 1;

    static Object o1 = new Object();
    static Object o2 = new Object();

    public static void main(String[] args) {
        MustDeakLock m1 =  new MustDeakLock();
        MustDeakLock m2 =  new MustDeakLock();
        m1.flag = 1;
        m2.flag = 0;
        Thread thread1 = new Thread(m1);
        Thread thread2 = new Thread(m2);
        thread1.start();
        thread2.start();
    }

    @Override
    public void run() {

        if(flag == 1){
            synchronized (o1){
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("我得到锁1");
                synchronized (o2){
                    System.out.println("我得到锁2");
                }
            }
        }

        if(flag == 0){
            synchronized (o2){
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("我得到锁2");
                synchronized (o1){
                    System.out.println("我得到锁1");
                }
            }
        }
    }
}

死锁的四个条件

互斥条件:相同的锁不能被线程同时持有

请求与保持:保持自己的锁请求别人的锁

不剥夺条件:没有外力可以调解

循环等待:多个线程互相循环等待

定位死锁 

  1. jps jstack 
  2. ThreadMXBean
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();
for(int i = 0; i<deadlockedThreads.length; i++){
    ThreadInfo threadInfo = threadMXBean.getThreadInfo(deadlockedThreads[i]);
    System.out.println(threadInfo.getThreadName());
}

避免死锁策略 

  1. 设置超时时间
  2. 获取锁的顺序
  3. 多使用并发类
  4. 降低锁的粒度

 

 

 


http://www.niftyadmin.cn/n/613308.html

相关文章

2020FME博客大赛——基于FME利用高德路径规划AP实现公共服务设施可达性分析——以厦门山海健康步道为例

作者&#xff1a;郭文义 单位&#xff1a;厦门市环境科学研究院 等时圈&#xff08;siochrone&#xff09;&#xff0c;指从某点出发&#xff0c;以某种交通方式在特定时间内能到达的距离覆盖的范围&#xff08;来自于网络&#xff09;。&#xff08;An isochrones is an isol…

python中range返回的是什么_Python range()返回的是什么

Python range()返回的不是列表对象&#xff0c;而是可迭代对象下面这段代码&#xff1a;import numpy as npdef load_planar_dataset():np.random.seed(1)m 400 # number of examplesN int(m/2) # number of points per classD 2 # dimensionalityX np.zeros((m,D)) # data…

2020FME博客大赛——基于FME的海量数据点高效率抽稀技术及实现

作者&#xff1a;杨忠智 单位&#xff1a;深圳市城市规划决策与仿真重点实验室 摘要&#xff1a;POI&#xff08;兴趣点&#xff09;是电子地图的重要组成部分&#xff0c;而海量密集的兴趣点显示&#xff0c;则常常需要先进行抽稀处理&#xff0c;怎样使其分布均匀合理&#…

如何将某个groupbox中的数据赋值到另一个groupbox_10道JS数据类型题,解决疑难杂症...

1.封装一个 javascript 的类型判断函数每个typeof 返回值是“object”都包含一个内部属性[calss]](可以看做是一个内部的类)&#xff0c;无法直接访问&#xff0c;可以通过Object.prototype.toString.call(...)来查看。// 测试let arr [1,2,3]console.log(Object.prototype.to…

python ppt 图片_python ppt 转 pdf 图片

ppt要想完美的转pdf&#xff0c;图片&#xff0c;还是需要在windows下面来操作。1&#xff0c;安装Python3.5.1下载地址&#xff1a;https://www.python.org/downloads/windows/Windows x86-64 executable installer&#xff0c;windows下64位安装程序安装界面&#xff0c;选中…

2020FME博客大赛——基于FME实现遥感影像坐标系的校正

作者&#xff1a;郝智坚 单位&#xff1a;中国移动位置服务中心 1前言 很有幸在我负责单位地图数据生产工作的时候接触到了强大的FME软件&#xff0c;自接触到FME以来&#xff0c;我极力在单位向身边同事推广FME软件&#xff0c;以至于还在单位向同事做了一次关于FME软件的技…

putty串口打开没反应_实例 | 使用Python串口实时显示数据并绘图

今天为大家分享一篇使用Python串口实时显示数据并绘图的例子&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一、安装pyserial以及基本用法使用pyserial进行串口传输&#xff0c;在cmd下输入命令pip install pyserial注&#xff1a;升级pip后会出现 "‘E…