Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你知道死锁是怎么产生的吗,怎么解决

你知道死锁是怎么产生的吗,怎么解决

作者头像
余生大大
发布于 2022-11-02 07:12:28
发布于 2022-11-02 07:12:28
61100
代码可运行
举报
文章被收录于专栏:余生大大余生大大
运行总次数:0
代码可运行

死锁的产生方式

死锁代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.an.learning.thread;

import java.util.concurrent.TimeUnit;

class HoldLockThread implements Runnable{

    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 自己持有" + lockA + "锁,尝试获得" + lockB);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有" + lockB + "锁,尝试获得" + lockA);
            }
        }
    }
}
/**
 * @author Anzepeng
 * @title: DeadLockDemo
 * @projectName learning
 * @description: 死锁
 * @date 2020/8/19 0019下午 16:43
 */
public class DeadLockDemo {

    public static void main(String[] args) {
        String lockA = "A";
        String lockB = "B";
        new Thread(new HoldLockThread(lockA,lockB),"A").start();

        new Thread(new HoldLockThread(lockB,lockA),"B").start();
    }
}

IDEA排查

使用Idea的Terminal输入命令jps -l

执行命令:jstack 9816   --- 使用jstack 端口号 查看执行信息

A持有 <0x00000000d635f928> 这个锁尝试占有<0x00000000d635f958>这个锁

B持有 <0x00000000d635f958>这个锁尝试占有<0x00000000d635f928>这个锁

互相僵持产生死锁

  • jps命令定位进程号
  • jstack找到死锁查看
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java并发编程-各种锁
来 源:https://www.cnblogs.com/huangjuncong/p/8542008.html
JavaFish
2019/10/16
8850
Java并发-死锁
 所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无其余方法作用,它们都将无法推进下去。  网友们有一个生动形象的比方:两个人面对面过独木桥,甲和乙都已经在桥上走了一段距离,即占用了桥的资源,甲如果想通过独木桥的话,乙必须退出桥面让出桥的资源,让甲通过,但是乙不服,为什么让我先退出去,我还想先过去呢,于是就僵持不下,导致谁也过不了桥,这就是死锁。其实死锁形成的关键就是:谁也不让谁,谁都不会主动地让步。
Fisherman渔夫
2020/02/18
7960
Java并发-死锁
4个java死锁工具:jstack、jconsole、jvisualvm、jmc
在 Java 中,死锁(Deadlock)情况是指:两个或两个以上的线程持有不同系统资源的锁,线程彼此都等待获取对方的锁来完成自己的任务,但是没有让出自己持有的锁,线程就会无休止等待下去。线程竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。
HaC
2022/04/13
7110
4个java死锁工具:jstack、jconsole、jvisualvm、jmc
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
https://blog.csdn.net/qq_29689343/article/details/105046493
訾博ZiBo
2025/01/06
940
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
面试系列之-java程序死锁排查及预防(JAVA基础)
死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态;
用户4283147
2023/09/11
3530
面试系列之-java程序死锁排查及预防(JAVA基础)
Java多线程常用面试题(含答案,精心总结整理)
Java并发编程问题是面试过程中很容易遇到的问题,提前准备是解决问题的最好办法,将试题总结起来,时常查看会有奇效。
全栈程序员站长
2022/09/13
1.2K0
Java多线程常用面试题(含答案,精心总结整理)
面试专题:简单写一个会导致死锁的程序
首先简单介绍一下什么是死锁。死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推荐下去;如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
小明爱吃火锅
2023/12/27
2130
【并发编程】synchronized底层原理及对象锁和类锁实践
首先我们分析这段代码一共起了多少线程,主线程、李祥线程、张三线程,主线程先启动,由于张三线程和李祥线程CPU调度不一定先分给谁,所以谁先运行都可能,但是他们在同一个售票机,也就是同一个锁资源,必然会出现,一个线程执行完成之后,才会执行另外一个线程。
互联网小阿祥
2023/05/28
2770
【并发编程】synchronized底层原理及对象锁和类锁实践
产生线程死锁的原因和处理方式
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 原因如下:
潇洒
2023/10/20
6130
产生线程死锁的原因和处理方式
Java--死锁以及死锁的排查
清单一代码有点长,但是逻辑很简单,有两个临界区变量lockA,lockB,线程A先获取到lockA在获取lockB,线程B则与之相反顺序获取锁,那么就可能会有以下情况: 线程A获取到lockA之后发现lockB已被线程B获取,那么此时线程A进入blocked状态。同理线程B获取lockA时发现其被线程A获取,那么线程B也进入blocked状态,那么这就是死锁。
屈定
2018/09/27
1.9K0
Java--死锁以及死锁的排查
死锁模拟
https://www.runoob.com/java/thread-deadlock.html
名字是乱打的
2021/12/24
4250
关于死锁/死锁的编码(模拟和解释)/死锁的定位
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
名字是乱打的
2022/05/13
5830
关于死锁/死锁的编码(模拟和解释)/死锁的定位
多线程的同步和死锁
李家酒馆酒保
2017/12/28
1.3K0
多线程的同步和死锁
死锁案例演示
两个或两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去。
别团等shy哥发育
2023/02/25
4540
死锁案例演示
面试-产生线程死锁的原因和处理方式
线程同步(就是加锁)会有一个问题,就是产生死锁 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
潇洒
2019/11/21
6960
1.3w字,一文详解死锁!
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。
磊哥
2021/09/09
3900
1.3w字,一文详解死锁!
JUC系列(九) CAS 与锁的理解
CAS:比较当前工作内存中的值,如果这个值是期望的,那么执行操作,如果不是就一直循环
冷环渊
2022/12/03
2890
JUC系列(九) CAS 与锁的理解
面试突击48:死锁的排查工具有哪些?
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方释放资源,但没有一方提起释放资源,从而造成了一种阻塞的现象就称为死锁。
磊哥
2022/05/18
5030
面试突击48:死锁的排查工具有哪些?
死锁的 4 种排查工具 !
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。
磊哥
2021/08/25
1.9K0
Java线程面试题:什么是死锁?如何避免?
死锁是指两个或多个线程相互等待对方持有的锁而不能继续执行,造成代码无法向下进行的情况。以下是一个简单的例子:
GeekLiHua
2025/01/21
1050
相关推荐
Java并发编程-各种锁
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验