74-线程间的通信-也叫等待和唤醒机制*等待和唤醒机制概述

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

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.等待和唤醒的代码同时只能一个执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值