Java经典面试题之写个死锁

java面试题41什么是死锁,如何避免? 摘要:死锁是指多线程/进程中因竞争资源导致相互等待的僵局。其四个必要条件是:互斥、占有并等待、不可剥夺和循环等待。常见避免策略包括破坏这些条件,如资源排序法(破坏循环等待)、一次性分配资源(破坏占有并等待)、使用银行家算法等。实际开发中建议采用资源排序法、减小锁范围、设置超时锁等预防措施。死锁检测与恢复机制则允许死锁发生后再处理。理解死锁原理和预防策略对构建健壮并发系统至关重要。(150字) 阅读详情
	最近有朋友去面试Java,被问到多线程呀、锁呀相关的知识,朋友balabala也基本能答上来,
然后面试官突然要求手写个简单的死锁出来,朋友一下子就懵住了~~,平时光看理论了,谁知道还
要手撕代码...,关键还乍写不出来...

	△:大环境这么差,面试还是要好好准备。

一、先上代码,非常简单
public class DeadlockTest {
	//定义2个资源
    private static final Integer a = 0;
    private static final Integer b = 1;

    public static void main(String[] args) {
        //启动2个线程,分别调用getA()和getB()
        new Thread(DeadlockTest::getA).start();
        new Thread(DeadlockTest::getB).start();
    }
	static void getA() {
		//用synchronized 对a对象加锁
        synchronized (a) {
            System.out.println(Thread.currentThread().getName() + "获取到A锁");
            try {
                //等待500ms,再去获取B资源锁,让另一个线程有时间去独占b
                Thread.sleep(500);
                getB();
                System.out.println(Thread.currentThread().getName() + "获取到B锁");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static void getB() {
        synchronized (b) {
            System.out.println(Thread.currentThread().getName() + "获取到B锁");
             try {
                //等待500ms,再去获取A资源锁,让另一个线程有时间去独占a
                Thread.sleep(500);
            	getA();
            	System.out.println(Thread.currentThread().getName() + "获取到A锁");
             } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

Thread-0获取到A锁
Thread-1获取到B锁	

OK,死锁产生了。

原因: Thread-0在拿到a对象的监视器锁(后文简称“A锁”)之后,又要去拿b对象的监视器锁(简称“B锁”),而此时B锁在Thread-1手中,于是Thread-0只能阻塞,等待B锁被Thread-1释放。
对Thread-1而言,亦是如此,死锁产生。


二、检查死锁

很多可视化工具可以,比如jdk自带jConsole,这边只说2个简单的方式。

  1. JDK命令行工具jps、jstack。

    1)jps获取当前运行的java进程,拿到pid。如下图:
    jps
    2)jstack pid 查看堆栈信息
    jstack

  2. IDEA在控制台点击Dump Threads图标
    在这里插入图片描述


三、产生死锁的4个必要条件

1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

在上面代码中就是通过synchronized加锁,该锁是独占的、排它的。一个线程获取到之后,
不允许第二个线程同时获取。

2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

 Thread-0拿到A锁的同时,又要请求B锁,但B锁被 Thread-1占有,所以要阻塞自己,等待B资源。

3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

Thread-0不能抢占Thread-1已拥有的资源,只能等待其主动释放。

4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

Thread-0等待Thread-1占用的资源B,Thread-1等待Thread-0占用的资源A,形成环路等待条件。
【Java面试题汇总】多线程、JUC、锁篇(2026版) 线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC 阅读详情

相关推荐

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

经典面试题-死锁

死锁是指在并发系统中,两个或多个进程(或线程)互相等待对方所占有的资源而无法继续执行的情况。这种情况下,每个进程都在等待其他进程释放资源,导致所有进程都无法向前推进。

weixin_71841320的博客 4142

学习海康VisionMaster之圆查找

(1):ROI选中位置修正,并且修正信息需要选择刚刚创建的位置修正组件输出信息,这里的话后续的检测窗口一般都需要做这一步,因为大部分的应用场景都是需要用到实时跟踪的。圆查找模块是用于查找指定区域的圆,并且会输出该圆的相关参数信息,比如圆中心点,圆半径,圆是否存在等信息。7):剔除点数:和高级参数里面的剔除距离搭配使用的,就是过滤较远的边缘点,让拟合圆心出来的轮廓更加接近。中的圆查找,相当于就是拟合圆心,这个在视觉软件中的应用也是非常广泛的,通常用于定位,测量项目。

yuhouxiyang的专栏 2104

Java线程面试题:什么是死锁?如何避免?

总结:死锁是一种常见的并发问题,可以通过避免使用多个同步锁、保证获取锁的顺序和使用定时锁等策略来避免。在进行并发编程时,应当尽量避免出现死锁问题,以保障程序运行的稳定性和正确性。死锁是指两个或多个线程相互等待对方持有的锁而不能继续执行,造成代码无法向下进行的情况。由于两个线程都在等待对方释放所持有的锁,因此出现了死锁情况。的锁,也进入临界区并休眠1秒钟,然后试图获取。的锁,进入临界区并休眠1秒钟,然后试图获取。中修改了竞争锁的获取顺序,使其先获取。的锁,从而解除了死锁情况。

jakelihua 389

手把手拆解DGX GB200 NVL72:1个机柜如何塞进72块GPU?详解NVLink Switch铜缆背板设计

本文深度解析英伟达DGX GB200 NVL72系统如何通过NVLink Switch铜缆背板设计,在标准42U机柜中集成72块B200 GPU,实现1800GB/s的超高带宽。文章详细介绍了模块化架构、铜缆互连技术、液冷散热方案和高密度供电系统等核心创新,为AI算力需求提供突破性解决方案。

red88的博客 1581

9篇1章1节:中国居民健康与营养调查(CHNS)数据库的官网解析和数据下载(2026年版)

在探讨中国社会经济转型与人口健康变迁的学术领域中,中国健康与营养调查(CHNS) 是一个无法绕过的权威数据库。本文将带你深入了解CHNS的项目背景、庞大的数据体系,以及如何通过这两个核心网站获取关键的家庭、个人及社区层面的研究数据。

MD Code 1698

【无标题】Java中的锁常见面试题总结

死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续。

m0_46502752的博客 2143

⑩电子产品拆解分析-家用无线遥控开关433Mhz

①免布线随意贴,装上就能使用解决单线开关烦恼;②遥控配对简单,无线通讯距离长,信号可穿墙;

a6662580的博客 4696

Java 锁 高频 面试题回答

之前面了几个开发,问了关于锁的知识都是一问三不知 ,也许是业务场景中出现的比较少,所以这些人只能回答出一些基础的线程方面的知识,之前也看了些书,做一些记录 ,所以和大家分享一下。

程序员小刘 2281

镜头调焦的 调整的是焦距还是像距?

在镜头 “调焦”(即日常拍照时的)中,调整的核心是,而非焦距。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1352

DAF-Net:动态注意力红外-可见光图像融合

DAF-Net 红外-可见光融合链路:IR/VIS 双分支 (Conv+ResBlock → 64ch) → DynamicAttentionFusion (Cat→Sigmoid→加权) → 重建 (Conv→Sigmoid)。TNO 上 SSIM=0.782 (vs IR), 0.734 (vs VIS), 参数量仅 218K。核心贡献:轻量动态注意力门控, 无监督 SSIM+MSE 损失不需要配准 ground truth。

FJN110的博客 319

经典面试题:谈谈对死锁的理解

介绍了死锁的定义,三个典型情况,死锁形成的四个必要条件以及如何破除死锁

m0_63904107的博客 6534

OPC UA协议深度解析 + C#跨平台实战:无缝对接西门子S7-1200/1500 PLC

本文完成了OPC UA协议深度解析→西门子PLC服务端配置→C#跨平台客户端开发→全平台部署拆解OPC UA核心模型与安全机制,从原理层面理解工业标准化通信逻辑基于官方SDK开发工业级客户端,支持读写、订阅、证书管理、心跳保活核心功能实现Windows、Linux、统信UOS全平台兼容,满足工控系统国产化改造刚需提供完整的优化方案与踩坑指南,可直接落地商用项目。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 520

什么是死锁?自己动手写死锁。一个死锁的例子。死锁的四个条件,如何避免死锁。

文章目录一、什么是死锁二、动手写死锁三、发现排查死锁情况四、解决办法 面试题就好像计算机二级一样扯淡的出一些并不常见的题目(甚至写法很反人类),我们就借此锻炼一下逻辑能力把。 一、什么是死锁 死锁不仅在个人学习中,甚至在开发中也并不常见。但是一旦出现死锁,后果将非常严重。 首先什么是死锁呢?打个比方,就好像有两个人打架,互相限制住了(锁住,抱住)彼此一样,互相动弹不得,而且互相欧气,你不松手我就不...

白衣 5602

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java多线程进阶-死锁与面试题解析

学到这里,我们总算来到了 Java 多线程学习之旅的最后一站。在前面的笔记里,我们一起探索了锁策略、`synchronized` 的底层细节、JUC 工具包以及各种并发集合。现在,是时候挑战两个“终极 BOSS”了: 1. **死锁**:并发编程中最让人头疼的噩梦。 2. **面试题**:检验我们学习成果的试金石。 这篇笔记的目标很明确:首先,彻底搞懂死锁的成因和避免策略;然后,整理一份相对全面的并发面试题库。这既是对整个系列知识的最终巩固,也希望能帮助自己(以及其他可能读到这篇笔记的朋友)

weixin_73966418的博客 1508

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java经典面试题

这份面试题,包含的内容了十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM。下面一起来看 208 道面试题,具体的内容。以下是网上整理的非常全面的面试题,当然,绝大多数人不可能全部用到,但是都罗列在此,大家可根据自己的情况,选择对应的模块进行阅读。

2401_87878486的博客 1339

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【JAVA-Day79】 线程死锁讲解

线程死锁是多线程编程中一种常见的问题,它发生在多个线程互相持有对方所需的资源而无法继续执行的情况下。要避免线程死锁,需要注意线程之间资源的获取顺序和释放顺序,以及避免循环等待的情况发生。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

【Java并发编程】经典面试题总结-史上最全面试题思维导图总结(2022最新版)

「Java学习+面试指南」思维导图,计算机自学指南,包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结构、操作系统等,后台技术栈/架构师之路/全栈开发社区,阿里,腾讯,百度,美团,头条等春招/秋招/校招/面试

HNUJSY 4466

Java面试题之写一个死锁代码片段的正确姿势

1、引言 面试的时候可能会让你写一段死锁的代码,其实如果对死锁理解深刻,写出来并不难。 其中一个典型场景,就是一个线程持有A锁,然后请求获取B锁。另外一个线程正好相反,持有B锁,等待获取A锁。 2、死锁必备的四个条件 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。...

悟鸣的技术博客 2943

Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)

Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)

架构师尼恩 1965

【Java-多线程】什么是死锁?怎么避免死锁?

摘要: 死锁是多个线程因争夺资源相互等待的僵局。文章通过"转账死锁"案例演示了死锁场景,并解析其四个必要条件:互斥、持有等待、不可抢占和循环等待。提出四大解决方案:1)统一加锁顺序(按资源编号获取);2)使用tryLock超时机制;3)资源预分配;4)缩小锁范围。推荐开发时采用并发工具包、限制锁作用域,并利用jstack等工具监控线程状态。附思维导图归纳死锁条件与破解策略,强调预防优于检测的并发编程原则。(148字)

ZGW0513的博客 1102

面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!

## 什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。产生死锁的原因,主要包括: - 系统资源不足; - 程序执行的顺序有问题; - 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,那么死锁出现的可能性就很低;否则, 就会因争夺有限的资源而陷入死锁。其次,程序执行的顺序与速度不同,也可能产生死锁。产生死锁的四个必要

安正勋的博客 2万+

【Java 面试题】经典 Java 面试题 200 问(上)

本文整理于周瑜老师的《经典 Java 面试题 200 问》,目的是在面试前可以翻一翻,加深一些印象。

水滴的博客 1940

Java面试题:什么是死锁?如何手写一个死锁(Dead Lock)

要想实现一个死锁,首先要明白什么是死锁,我们看一下死锁的定义: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。--百度 用通俗的话来说就是张三跟李四下饭馆吃饺子,张三拿着醋,李四拿着蒜瓣,张三说李四你给我吃点蒜,李四说,那不行,你...

Bean冷的心的博客 3790

最新面试官:手写一个必然死锁的例子?一顿操作猛如虎。。,高级java面试题

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。

2401_84688353的博客 967

面试题:实现一个死锁(Java版),产生死锁的四大必要条件,如何避免死锁,如何解决死锁

实现一个最简单的死锁(Java版) /** * @author wall * @date 2019/7/29 16:42 * @description 实现一个死锁:A线程获取B线程占有的锁,B线程获取A线程占有的锁 */ public class DeadLock { //定义两把锁 private static ReentrantLock lockA = ne...

Wall的博客 3670
上一篇: 分布式事务一致性:三阶段提交协议(3PC)
下一篇: SpringBoot项目集成(一):5分钟学会使用分布式调度框架Elastic-Job
Yeomer
博客等级 码龄10年 42粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值