什么是死锁?

线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法继续执行,如果线程都不主动释放所占有的资源,将产生死锁。

当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

产生原因:

  • 持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。
  • 持有资源的锁,去竞争锁已被占用的其他资源,形成程序僵死的争关系。
  • 信号量使用不当。

如线程A占有资源 1 的锁,去竞争资源 2 的锁;线程 B 占有资源 2 的锁,去竞争资源1的锁。

代码表现如下

package constxiong.concurrency.a022;/** * 测试死锁 * @author ConstXiong * @date 2019-09-23 19:28:23 */public class TestDeadLock { final static Object o1 = new Object();final static Object o2 = new Object();public static void main(String[] args) {//先持有 o1 的锁,再去获取 o2 的锁Thread t1 = new Thread() {@Overridepublic void run() {synchronized (o1) {System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o1 对象的锁");try {System.out.println("休眠1秒");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o2 对象的锁");synchronized (o2) {System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o2 对象的锁");}}}};//先持有 o2 的锁,再去获取 o1 的锁Thread t2 = new Thread() {@Overridepublic void run() {synchronized (o2) {System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o2 对象的锁");try {System.out.println("休眠1秒");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o1 对象的锁");synchronized (o1) {System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o1 对象的锁");}}}};t1.start();t2.start();}}

测试结果,发生死锁,打印如下

线程:Thread-0 获取到 o1 对象的锁休眠1秒线程:Thread-1 获取到 o2 对象的锁休眠1秒线程:Thread-1 去获取 o1 对象的锁线程:Thread-0 去获取 o2 对象的锁

给TA打赏
共{{data.count}}人
人已打赏
Java

如何创建、启动 Java 线程?

2020-7-31 0:13:20

Java

Executors创建线程池有哪几种方式?

2020-7-31 0:16:40

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索