当前位置:首页 > 科技  > 软件

为了让小白也能看懂这个死锁Case,我请来了小黑...

来源: 责编: 时间:2024-01-19 09:16:51 343观看
导读小黑有点困,他想休息,又怕耽误时间,于是准备小眯一会。为了能按时起来,他设了闹钟,作为程序员,必须得整两个,防止单点故障。当任意一个闹钟响起,小黑就起来把两个闹钟都关掉,继续干活,就像这样:public class Clock { private

小黑有点困,他想休息,又怕耽误时间,于是准备小眯一会。YBJ28资讯网——每日最新资讯28at.com

为了能按时起来,他设了闹钟,作为程序员,必须得整两个,防止单点故障。YBJ28资讯网——每日最新资讯28at.com

当任意一个闹钟响起,小黑就起来把两个闹钟都关掉,继续干活,就像这样:YBJ28资讯网——每日最新资讯28at.com

public class Clock {    private BlackBro blackBro;    public void setBlackBro(BlackBro blackBro) {        this.blackBro = blackBro;    }    public synchronized void ring() {        System.out.println(Thread.currentThread() + " Clock.ring...");        blackBro.wake();    }    public synchronized void close() {        System.out.println(Thread.currentThread() + " Clock.close...");    }}
public class BlackBro {    private Clock[] clocks;    public void setClocks(Clock[] clocks) {        this.clocks = clocks;    }    public synchronized void wake() {        System.out.println(Thread.currentThread() + "BlackBro.wake...");        for (Clock clock : clocks) {            clock.close();        }    }}

为了防止闹钟和小黑在执行操作期间被人打扰,我贴心地给他们都加上了锁 —— synchronized。YBJ28资讯网——每日最新资讯28at.com

模拟这个场景将是这样:YBJ28资讯网——每日最新资讯28at.com

public static void main(String[] args) {    Clock clock1 = new Clock();    Clock clock2 = new Clock();    BlackBro blackBro = new BlackBro();    clock1.setBlackBro(blackBro);    clock2.setBlackBro(blackBro);    blackBro.setClocks(new Clock[]{clock1, clock2});    // sleep...    Thread t1 = new Thread(clock1::ring);    Thread t2 = new Thread(clock2::ring);    t1.start();    t2.start();}

启动程序发现,陷入了无尽地等待:YBJ28资讯网——每日最新资讯28at.com

Thread[Thread-0,5,main] Clock.ring...Thread[Thread-1,5,main] Clock.ring...Thread[Thread-1,5,main]BlackBro.wake...

这是怎么回事?眼尖的同学肯定发现问题了。我们看一下 jstack:YBJ28资讯网——每日最新资讯28at.com

Found one Java-level deadlock:============================="Thread-0":  waiting to lock monitor 0x0000600003ecc000 (object 0x000000070fc52398, a com.demo.BlackBro),  which is held by "Thread-1""Thread-1":  waiting to lock monitor 0x0000600003ec04e0 (object 0x000000070fc50f88, a com.demo.Clock),  which is held by "Thread-0"Java stack information for the threads listed above:===================================================

原来是死锁了:我们起了两个闹钟线程,两个线程各自拿到自己的对象锁,开始 ring,ring 又都会去唤醒小黑,但小黑对象只有一个,只有一个闹钟能顺利拿到小黑的对象锁,小黑被唤醒后又去关闹钟,但却没法关掉,因为闹钟在等小黑唤醒的期间不会被别人打断,于是闹钟在等小黑,小黑在等闹钟,形成了死锁。YBJ28资讯网——每日最新资讯28at.com

我相信稍微仔细点大家都能发现这个问题,这是因为我把干扰项都排除,只留下非常简单的框架。如果在一个非常复杂的系统中,还是很难发现的。这也是我今天遇到的一个线上问题,花了半天时间才排查出来。YBJ28资讯网——每日最新资讯28at.com

这个 case 教育我们要谨慎使用锁,尤其是 synchronized;其次如果发现程序没有按预期地执行,尤其是该执行的没执行,可以留个心眼,看看堆栈是不是有死锁。YBJ28资讯网——每日最新资讯28at.com

2024 年第一个小case送给你,你学废了吗?YBJ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-64969-0.html为了让小白也能看懂这个死锁Case,我请来了小黑...

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java死锁,你学会了吗?

下一篇: 分享六个实用的 JS 小技巧,让你的代码显得更专业些

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top