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()之间

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来重新获得锁。
相关推荐
黄苏婷:小哥哥好棒,加油!希望后面多多更新,争取拿到字节的offer
查看13道真题和解析 点赞 评论 收藏
分享
02-24 19:45
西南大学 后端工程师
程序员小白条:简历写的有点太多了,一般两页是实习经历比较多的情况下,要么自己有一些有影响力的开源项目,如果你走软件,硬件没必要实习,学校安排总是没区分度的,央国企最好有中大厂实习,另外学历比较重要,不是都要求硕士的,技术会比互联网要求低一些 点赞 评论 收藏
分享