Java多线程设计模式wait和notify机制总结

Java多线程设计模式wait和notify机制总结:

  • wait和notify方法必须写在synchronized方法内,即在调用wait和notify方法前,需先获得对象锁;
  • 调用wait方法则释放锁;wait方法返回后,需获得对象锁才可继续执行下面语句;
  • 多个线程wait时,若另外的线程调用notify方法后,由JVM决定唤醒其中一个线程;
  • 多个线程wait时,若另外的线程调用notifyAll方法,则唤醒所有wait线程,但是只有其中一个线程可以获得对象锁,执行wait下面的语句,其余的等待释放对象锁后才可执行;
  • 调用notify/notifyAll时,线程并没有释放对象锁,只是其余线程被唤醒,但仍无法执行,只有等调用完notify/notifyAll并退出synchronized块,释放对象锁后,其余线程中的一个才可获得锁执行。

另:sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁。也就是说,如果有Synchronized块,其他线程仍然不能访问共享数据。

    举生产者-消费者例子来说:仓库提供两个同步方法,一个put,一个get,假设put方法中线程sleep30秒,在这段时间中,get方法并不能从仓库中获取产品,因为sleep时并没有释放对象锁,所以调用get方法的线程不能执行。

    假设有两个线程同时执行,都没有调用synchronized方法,一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。

    即:sleep方法可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程获得执行的机会。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。