java多线程核心技术 第三章线程间通信

1.等待通知机制
wait/notify
如果有多个线程等待的时候 notify会随机挑出一个wait状态的线程发出notify通知,并使它等待获取该对象的对象锁。 注意:在执行notify方法后,当前线程不会马上释放该对象锁,呈wait状态的线程并不能马上获取该对象锁,要等到执行notify方法的线程将程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁。当第一个获得了该对象锁的wait线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态的线程由于没有得到改对象的通知,还会继续阻塞在wait状态,直到这个对象发出一个notify 或者notifyAll
总结:wait使线程停止运行,而notify使停止的线程继续运行。
notify是随机唤醒队列中等待同一资源的一个线程,使其进入可运行状态,但不一定立即运行
notifyAll使等待队列中的所有线程全部进入可运行状态,不一定哪个线程先执行,可能是优先级高的,也有可能是随机执行。

线程进入Runnable状态大体分为5中情况:
1.调用sleep方法后经过的时间超过了指定的休眠时间
2.线程调用的阻塞io已经返回,阻塞方法执行完毕
3.线程成功地获得了试图同步的监视器
4.线程正在等待某个通知,其他线程发出了通知。
5处于挂起状态的线程调用了resume方法。
出现阻塞的情况大体分为5种:
1.线程调用sleep方法,主动放弃占用的处理器资源。
2.线程调用了阻塞式IO方法,该方法返回前,该线程被阻塞。
3.线程试图获得一个同步监视器,但该同步监视器正在被其他线程所持有
4.线程等待某个通知
5.程序调用了suspend方法将该线程挂起。此方法容易造成死锁,尽量避免使用该方法。

java 中wait方法 会释放锁
notify方法不释放锁
sleep 方法也不会释放锁
注意:当线程处于wait状态这时候调用 interrupt()方法就回造成interruptedException异常
wait(long)支持传递一个毫秒数 在这个时间后会自动唤醒,但是这个时间内也可以被其他线程唤醒

练习生产者消费者

2.join方法 作用:等待对象线程销毁
join 在遇到interrupt()方法 也会出现中断异常
join 和sleep的区别
join会释放锁 内部是wait实现的
sleep不会释放锁

3.ThreadLocal 主要是解决变量在不同线程中的隔离性(子线程和父线程中取得的值也是不同),也就是不同线程拥有自己的值,不同线程中的值可以放入ThreadLocal进行保存
解决get值为null 继承ThreadLocal 重写initialValue()方法初始化返回一个值

4.InheritableThreadLocal 可以在子线程中取得父线程中的值
注意一点,在子线程取得值得同时,主线程将InheritableThreadLocal 中的值进行修改 那么子线程取到的值是旧值 取得的值应该是 childValue方法返回的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值