通过假设了解为什么 wait/notify 定义在 Object 类中

这是一个老生常谈的面试题了,waitnotify 配合监视器提供了多个同步线程之间通信机制,答案本身也很简单,由于通信本身解决的就是锁的归属问题(发现当前应该把锁给别人时调用 wait, 通知别人可以来用锁了调用 notify),从功能上讲,放在 Object 类(锁对象)中本就是理所当然的。

但我们可以换个角度去思考,不妨使用假设法,假设 waitnotify 是放在 Thread 类中,看看使用的情况会是怎么样的。

由于线程之间并不知道其他对象获取锁的情况,需要额外的开销去记录和遍历其他线程的情况,并且一个线程实际上是可以拥有多个锁的。因此,要实现线程通信机制,有两个必不可少的参数,线程和锁对象。

synchronized(lock) {
    Thread.currentThread().wait(lock);
}

如果是这么使用的话其实没有什么问题,从功能上来说其实和 lock.wait() 没有什么区别。但是,只要有存在的可能,就一定会发生。有些人可能刚好由于契合某些业务来实现某些功能会写出以下代码:

List<Thread> threadList = ...

synchronized(lock) {
    threadList.get(i).wait(lock);
}

在当前线程的代码允许其他的线程在所需的锁上等待,这种“入侵”式的代码给设计和维护带来了许多的困难,原本并发程序就不好调式,这样一来就更加的混乱,并且产生无法预计和复现的错误。毕竟可能让使用者产生错误用法的设计就不是一个好的设计。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,244评论 0 14
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 1,992评论 0 8
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,140评论 0 8
  • 由于时间仓促,有些地方未写完,后面会继续补充.如有不妥之处,欢迎及时与我沟通. 如果你也是在学习java,给你们推...
    分不清java阅读 2,848评论 0 15
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 669评论 0 4