1.概念:多个线程在处理同一个资源(包子),但是处理的动作(线程的任务)却不相同(一个生产一个做),就存在通信问题。
为什么需要通信:
多个线程并发执行时,在默认情况下cpu是随即切换线程的,当我们需要多个线程来完成同一件任务,并且我们希望他们有规律的运行,呢么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。
如何保证多线程有效利用资源:
多线程在操作同一份数据时,避免对同一共享变量的争夺,用等待唤醒机制
2.等待和唤醒机制概述
3个方法
wait:线程不在活动,不参与调度,进入等待wait set 不会去竞争锁了
notify:选取所有通知对象中的其中一个线程释放,例如 餐厅有空位置后,等待就餐最久的先入座
notifyAll:释放所有通知对象的wait set上的全部线程
注意:哪怕只通知notify一个等待的线程,被通知线程也不能立即执行,因为他当初中断的地方是在同步块内,而此刻他已不再持有锁,所以他需要再次尝试去获取锁(很有可能面临竞争),成功后才能在当初调用wait方法的地方恢复执行
总结:如果能获取锁,线程就从无限等待wait变成Runnable
否则就是从wait set出来进入到entry set 线程就从wait进入blocked阻塞状态
注意
1.调用wait和notify方法必须要有同一个锁对象调用,一次你:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后面的线程
2.wait和notify方法属于Object类的方法的,因为:锁对象可以是任意对象,二任意随心的所属类都是继承了 Object类的
3.wait和notify方法必须要在同步代码块或者同步方法中使用,因为:必须要通过锁对象调用这两个方法
4.等待和唤醒的代码同时只能一个执行

本文探讨了多线程环境下资源处理的问题,强调了线程间通信的重要性。当多个线程并发操作同一资源时,需要通过等待唤醒机制协调,确保资源的有效利用。wait和notify方法用于线程间的通信,必须在同步代码块中调用,并且需要在同一锁对象上进行。总结了wait和notify的工作原理,以及它们的使用注意事项,帮助理解多线程中的同步控制策略。

986

被折叠的 条评论
为什么被折叠?



