Java多线程之间通信方式?

1. wait(),  notify(),  notifyAll()

若线程之间采用synchronized来保证线程安全,可以用这几个方法实现线程通信。

这几个方法都是Object中声明的方法,而不是Thread类声明的。因为每个对象都有锁,所以让当前线程等待某个对象的锁,应该通过这个对象来操作(上锁或解锁)。另外这几个方法都是本地方法,且被final修饰。

wait可以让当前线程释放锁,然后把线程放入阻塞队列中,进入阻塞状态。
notify可以唤醒阻塞队列中的某个线程,使其进入就绪队列,以便在当前线程释放锁后进行竞争锁,进而得到cpu的执行。
notifyAll和notify原理上差不多,只不过是唤醒阻塞队列中的全部线程参与竞争锁。

2. await(),  signal(),  signalAll()

如果线程采用Lock来保证线程安全,可以用这几个方式进行线程通信。

这几个方法都是Condition接口的方法,在Java1.5中实现。其使用依赖于Lock,相比于第一种通信方式,这种更安全高效。

await/signal/signalAll的使用必须要在Lock的保护之内,即在lock.lock() 和 lock.unlock()之间



2022-03-15
在牛客打卡55天,今天也很努力鸭!
全部评论
sleep()与wait()的区别? 1. sleep是Thread类中的静态方法,而wait是Object的成员方法。 2. sleep可以用在任何地方,wait只能用在同步方法或同步代码块中。 3. sleep不会释放锁,而wait会,并需要通过notify/notifyAll来重新获得锁。
点赞
送花
回复 分享
发布于 2022-03-15 23:04

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务