- 书中描述“线程对立”的原文
- 我的问题
- 阅读源码查证
线程对立是指不管调用端是否采取了同步措施,都无法在多线程环境中并发使用代码。由于Java语言天生就支持多线程的特性,线程对立这种排斥多线程的代码是很少出现的,而且通常都是有害的,应当尽量避免。
一个线程对立的例子是Thread类的suspend()和resume()方法。如果有两个线程同时持有一个线程对象,一个尝试去中断线程,一个尝试去恢复线程,在并发进行的情况下,无论调用时是否进行了同步,目标线程都存在死锁风险——假如suspend()中断的线程就是即将要执行resume()的那个线程,那就肯定要产生死锁了。也正是这个原因,suspend()和resume()方法都已经被声明废弃了。
我的问题原文中:
假如suspend()中断的线程就是即将要执行resume()的那个线程,那就肯定要产生死锁了
这句话听起来很奇怪,怎么也想不通为什么会产生死锁,无奈之下只能阅读源码查证。
阅读源码查证Thread::suspend()源码:
@Deprecated
public final void suspend() {
checkAccess();
suspend0();
}
重点在于这一段:
大致意思是:
如果本方法要去要暂停的目标线程,持有一个重要系统资源的监控器的锁,那么暂停之后,直到目标线程被resume,没有线程可以获取到这个重要资源。
此外,如果要对目标线程执行resume操作的那个线程,需要先获取到那个重要系统资源监控器的锁,之后才能调用resume(),那么死锁就产生了,因为直到目标线程被resume,没有线程可以获取到这个重要资源。
可见源码中的内容和书中的内容还是有出入的,需要阅读源码才能理解书中的例子。



