deadlock的几个问题

文章讨论了Java编程中出现的死锁现象,包括死锁的定义、形成条件、避免方法以及检测和处理手段。通过一个线程死锁的例子,展示了两个线程互相等待对方释放资源导致的僵局,并提供了Jconsole工具分析死锁的示例。

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

随手列举几个问题。

1. 什么是死锁(一部分人认为是锁等待了)

2. 形成死锁的条件(不止一个线程,不止一个资源。一部分人只提到一个资源)

3. 如何避免死锁(从死锁形成的条件出发)

4. 死锁检测(借助一些工具,如jconsole, 或是看thread dump)

5. 出现死锁如何处理(找出问题,修复吧)

以下是用Java编写的一个死锁场景的thread dump片段。从里面可以看出,线程0占着一个资源了,还想去拿线程1占有的一个资源,而线程1却也在等着线程0释放它占着的资源。你拿着不放,想要我放;我也拿着不放,想要你放。好吧,那就干等了。

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00000266ff560a38 (object 0x00000007799301a0, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00000266ff55ed58 (object 0x0000000779930178, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
	at Thead1.run(Thead1.java:24)
	- waiting to lock <0x00000007799301a0> (a java.lang.Object)
	- locked <0x0000000779930178> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:750)
"Thread-0":
	at Thead1.run(Thead1.java:24)
	- waiting to lock <0x0000000779930178> (a java.lang.Object)
	- locked <0x00000007799301a0> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:750)

Found 1 deadlock.

以下是Jconsole的截图。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值