开发者社区> 问答> 正文

为什么等待和通知是在Object类而不是Thread中声明的?

为什么等待和通知是在Object类而不是Thread中声明的?

展开
收起
珍宝珠 2020-02-07 16:30:09 1526 0
1 条回答
写回答
取消 提交回答
  • 为什么在Object类中定义wait和notify方法,每个人都能说出一些理由。从我的面试经验来看,wait和nofity仍然是大多数Java程序员最困惑的,特别是2到3年的开发人员,如果他们要求使用wait和notify,他们会很困惑。因此,如果你去参加Java面试,请确保对wait和notify机制有充分的了解,并且可以轻松地使用wait来编写代码,并通过生产者-消费者问题或实现阻塞队列等了解通知的机制。

    为什么等待和通知需要从同步块或方法中调用,以及Java中的wait,sleep和yield方法之间的差异,如果你还没有读过,你会觉得有趣。为何wait,notify和notifyAll属于Object类?为什么它们不应该在Thread类中?以下是我认为有意义的一些想法:

    1)wait和notify不仅仅是普通方法或同步工具,更重要的是它们是Java中两个线程之间的通信机制。对语言设计者而言,如果不能通过Java关键字(例如synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用,那么Object类则是的正确声明位置。记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保Java类的线程安全,而wait和notify是两个线程之间的通信机制。

    2)每个对象都可上锁,这是在Object类而不是Thread类中声明wait和notify的另一个原因。

    3)在Java中为了进入代码的临界区,线程需要锁定并等待锁定,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有,并且他们应该等待取得锁,而不是去了解哪个线程在同步块内,并请求它们释放锁定。

    4)Java是基于Hoare的监视器的思想(http://en.wikipedia.org/wiki/...。在Java中,所有对象都有一个监视器。

    线程在监视器上等待,为执行等待,我们需要2个参数:

    一个线程

    一个监视器(任何对象)

    在Java设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,导致在设计并发程序时会遇到困难。请记住,在Java中,所有在另一个线程的执行中侵入的操作都被弃用了(例如stop方法)。

    2020-02-07 16:32:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载