Java死锁的产生到消除

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

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. 降低锁的粒度

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值