栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

学习《深入理解Java虚拟机(第三版)》时,对于“线程对立”案例的思考

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习《深入理解Java虚拟机(第三版)》时,对于“线程对立”案例的思考

对于"线程对立"所举案例的思考
  • 书中描述“线程对立”的原文
    • 我的问题
    • 阅读源码查证

书中描述“线程对立”的原文

线程对立是指不管调用端是否采取了同步措施,都无法在多线程环境中并发使用代码。由于Java语言天生就支持多线程的特性,线程对立这种排斥多线程的代码是很少出现的,而且通常都是有害的,应当尽量避免。

一个线程对立的例子是Thread类的suspend()和resume()方法。如果有两个线程同时持有一个线程对象,一个尝试去中断线程,一个尝试去恢复线程,在并发进行的情况下,无论调用时是否进行了同步,目标线程都存在死锁风险——假如suspend()中断的线程就是即将要执行resume()的那个线程,那就肯定要产生死锁了。也正是这个原因,suspend()和resume()方法都已经被声明废弃了。

我的问题

原文中:

假如suspend()中断的线程就是即将要执行resume()的那个线程,那就肯定要产生死锁了

这句话听起来很奇怪,怎么也想不通为什么会产生死锁,无奈之下只能阅读源码查证。

阅读源码查证

Thread::suspend()源码:

    
    @Deprecated
    public final void suspend() {
        checkAccess();
        suspend0();
    }

重点在于这一段:

    

大致意思是:
如果本方法要去要暂停的目标线程,持有一个重要系统资源的监控器的锁,那么暂停之后,直到目标线程被resume,没有线程可以获取到这个重要资源。
此外,如果要对目标线程执行resume操作的那个线程,需要先获取到那个重要系统资源监控器的锁,之后才能调用resume(),那么死锁就产生了,因为直到目标线程被resume,没有线程可以获取到这个重要资源。

可见源码中的内容和书中的内容还是有出入的,需要阅读源码才能理解书中的例子。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644250.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号