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来重新获得锁。
相关推荐