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方法可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程获得执行的机会。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值