死锁问题

本文通过一个具体的Java示例展示了如何在多线程环境中形成死锁,并提出了避免死锁的方法。示例中定义了两个静态对象作为锁,通过两个线程分别获取不同的锁并在获取一个锁之后尝试获取另一个锁的方式,形成了死锁。为了避免这种情况,建议不要在一个代码块中同时持有多个对象的锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当线程中锁中套锁,两个线程在运行时都需要对方所占用的锁而不释放自己的锁,这样就造成了线程的停滞。下面通过一个例子来演示死锁的形成和避免办法。

 1 package cn.ftf.threadsafe;
 2 /**
 3  * 过多的同步可能会造成互相不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁,锁中套锁
 4  * 
 5  * 避免:不要再在同一代码块中同时持有多个对象的锁,避免锁中上锁
 6  * @author 房廷飞
 7  *
 8  */
 9 public class DeadLockThread implements Runnable{
10     static Object a=new Object();   //用Static关键字修饰,保证实例化多少个对象都是这同一个同一个对象
11     static Object b=new Object();
12     private boolean flag;
13     public DeadLockThread(boolean flag) {
14         super();
15         this.flag = flag;
16     }
17     @Override
18     public void run() {
19         if(flag) {
20             synchronized (a) {
21                 System.out.println("给  a 对象上锁了。");
22                 try {
23                     Thread.sleep(200);
24                 } catch (InterruptedException e) {
25                     e.printStackTrace();
26                 }
27                 synchronized (b) {
28                     System.out.println("给  b 对象上锁了。 a 锁中上锁");
29                 }
30             }
31         }else {
32             synchronized (b) {
33                 System.out.println("给  b 对象上锁了。");
34                 try {
35                     Thread.sleep(200);
36                 } catch (InterruptedException e) {
37                     e.printStackTrace();
38                 }
39                 synchronized (a) {
40                     System.out.println("给  a 对象上锁了。  b 锁中上锁");
41                 }
42             }
43         }
44     }
45     public static void main(String[] args) {
46         DeadLockThread dead1=new DeadLockThread(true);
47         DeadLockThread dead2=new DeadLockThread(false);
48         
49         new Thread(dead1).start();
50         new Thread(dead2).start();
51     }
52 }
53 
54 /*
55 运行结果:
56 
57 给  b 对象上锁了。
58 给  a 对象上锁了。
59 
60 */
61 
62 //避免办法:避免锁中上锁

 

转载于:https://www.cnblogs.com/fangtingfei/p/11256097.html

内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值