|
|
51CTO旗下网站
|
|
移动端

1.6.4 锁与死锁

《Java多线程与Socket:实战微服务框架》第1章多线程基础,本书尽量采用简要和通俗易懂的方式来介绍多线程知识。本节为大家介绍锁与死锁。

作者:庞永华来源:电子工业出版社|2019-03-26 15:52

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

1.6.4 锁与死锁

每个Java对象在内存中都有一个对应的监视器(monitor)。监视器被用来存储“锁”标记,以记录哪一个线程拥有这个对象的“锁”,又有哪些线程正在竞争这个“锁”。在同一时刻,只允许一个线程拥有此对象的“锁”。这种锁也被称为内置锁或内部锁。还有一种“锁”是自Java 5开始提供的Lock锁。其实现方式与对象的内置锁有很大不同,但本质上仍然是一种“锁”(参见1.7.6节)。

注:线程有没有拿到某个Java对象的“锁”并不影响线程对这个Java对象本身的访问!原因很好理解,一把锁可以用来锁一个房间,也可以用来锁一个抽屉。无论你是否拥有这个锁,都不影响你对这把锁本身的访问,但这决定了你是否能够访问这个房间或抽屉。

线程的死锁是指两个或两个以上的线程在执行过程中,由于争用资源时互不相让或通信方面的设计缺陷而造成这些线程都被阻塞的现象,若无外力作用,它们都将无法推进下去。

死锁的原因归纳起来有以下几种。

. 互不相让:线程1持有资源A,需要资源B才能继续,而线程2持有资源B,需要资源A才能继续;但双方互不相让而导致死锁。

. 循环依赖:线程1持有资源A,需要资源B才能继续;线程2持有资源B,需要资源C才能继续;而线程3持有C,需要资源A才能继续,从而导致死锁。

. ***阻塞:因为设计上或程序逻辑上的缺陷,导致在某种情况下,某线程一旦被阻塞,便再也没有机会被唤醒。比如,负责唤醒阻塞线程的线程意外退出或中断;或者被阻塞线程的唤醒条件不可能成立;抑或唤醒通知在线程被阻塞之前发生,导致被阻塞线程错过了唤醒通知。

. 资源不可用:线程取得了锁,并得以访问相应的资源;但由于资源不可用,导致执行的代码被阻塞而无法释放锁。

. 死循环:线程取得了锁,但不幸进入了死循环,导致锁无法被释放。

预防和处理死锁的方法:

. 避免临界区的嵌套,即尽量不要在释放锁之前竞争其他锁。

. 减小锁粒度,只在真正需要锁时才上锁,并尽快释放。

. 顺序访问资源,让不同的线程总是以相同的顺序访问资源。

. 竞争锁时总是限制时长,当超过一定时间还没获取到锁时则返回失败。

. 在竞争锁期间,要允许锁竞争动作被打断。

注:可以通过jstack、jconsole等工具查看线程信息,以识别死锁现象并分析成因。比如,通过jstack $pid 命令导出线程信息,以分析是否存在死锁。


喜欢的朋友可以加入官方的读书群

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

JSP应用开发详解(第二版)

本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JS...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客