加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何在非线程的对象上调用wait()和notify()方法?

发布时间:2020-12-15 07:36:13 所属栏目:Java 来源:网络整理
导读:如何在不是线程的对象上调用wait()和notify()方法?那真的没有意义,是吗? 当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()和notify()来理解线程之间的通信. 解决方法 锁定是关于保护共享数据. 锁定在受
如何在不是线程的对象上调用wait()和notify()方法?那真的没有意义,是吗?

当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()和notify()来理解线程之间的通信.

解决方法

锁定是关于保护共享数据.

锁定在受保护的数据结构上.线程是访问数据结构的东西.锁定在数据结构对象上,以防止线程以不安全的方式访问数据结构.

任何对象都可以用作内部锁(意味着与synchronized一起使用).这样,您可以通过将synchronized修饰符添加到访问共享数据的方法来保护对任何对象的访问.

在用作锁的对象上调用wait和notify方法.锁是一个共享的通信点:

>当一个有锁的线程调用notifyAll时,等待同一个锁的其他线程会收到通知.当具有锁定的线程在其上调用notify时,其中一个等待同一锁的线程会收到通知.
>当一个具有锁定调用的线程等待它时,该线程释放锁定并进入休眠状态,直到a)它收到通知,或者b)它只是任意唤醒(“虚假唤醒”);由于这两个原因之一,等待线程仍然停留在调用等待直到它被唤醒,然后线程必须重新获取锁定才能退出等待方法.

请参阅Oracle tutorial on guarded blocks,Drop类是共享数据结构,使用Producer和Consumer runnables的线程正在访问它.锁定Drop对象控制线程如何访问Drop对象的数据.

线程在JVM实现中被用作锁,建议应用程序开发人员避免使用线程作为锁.例如,documentation for Thread.join说:

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait,notify,or notifyAll on Thread instances.

Java 5引入了实现java.util.concurrent.locks.Lock的显式锁.这些比隐式锁更灵活;有类似于wait和notify(等待和信号)的方法,但是它们在条件上,而不在锁上.具有多个条件使得可以仅针对等待特定类型的通知的那些线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读