网站首页 > 精选教程 正文
要想实现多个线程之间的协同,如:线程执行先后顺序、获取某个线程执行的结果等等。 涉及到线程之间相互通信,分为下面四类:
1 文件共享
2 网络共享
socket编程问题,非本文重点,不再赘述
3 共享变量
4 线程协作 - JDK API
细分为: suspend/resume 、 wait/notify、 park/unpark
JDK中对于需要多线程协作完成某一任务的场景,提供了对应API支持。 多线程协作的典型场景是:生产者-消费者模型。(线程阻塞、 线程唤醒)
示例:线程1去买包子,没有包子,则不再执行。线程-2生产出包子,通知线程-1继续执行。
4.1 API - 被弃用的suspend和resume
作用:调用suspend挂起目标线程,通过resume可以恢复线程执行
被弃用的主要原因是,容易写出
死锁代码
- 同步代码中使用
- 先后顺序:suspend比resume后执行
所以用wait/notify和park/unpark机制对它进行替代
4.2 wait/notify
这些方法只能由同一对象锁的持有者线程调用,也就是写在同步块里面,否则会抛IllegalMonitorStateException
wait 方法导致当前线程等待,加入该对象的等待集合中,并且放弃当前持有的对象锁
notify/notifyAll 方法唤醒一个 或所有正在等待这个对象锁的线程。
虽然wait会自动解锁,但是对顺序有要求,如果在notify被调用之后, 才开始wait方法的调用,线程会永远处于WAITING状态。
- 正常使用
- 死锁
- 小结
4.3 park/unpark
线程调用park则等待“许可”,unpark方法为指定线程提供“许可(permit)” 。
不要求park和unpark方法的调用顺序
多次调用unpark之后,再调用park, 线程会直接运行。 但不会叠加,即连续多次调用park方法,第一次会拿到“许可”直接运行,后续调 用会进入等待。
- 正常
- 死锁
5 伪唤醒
之前代码中用if语句来判断,是否进入等待状态,是错误的!
官方建议应该在循环中检查等待条件,原因是处于等待状态的线程可能会收到错误警报和伪 唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。
伪唤醒是指线程并非因为notify、notifyall、 unpark等 api调用而唤醒,是更底层原因导致的。
6 总结
涉及很多JDK多线程开发工具类及其底层实现的原理
猜你喜欢
- 2024-11-14 Java项目实战-01-单体架构案例分析实现
- 2024-11-14 java 设计模式实战,建造者模式之生产线
- 2024-11-14 Github霸榜的SpringBoot全套学习教程,从入门到实战,内容超详细
- 2024-11-14 Spring Boot 缓存开发实战 springboot开启缓存
- 2024-11-14 价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册
- 2024-11-14 阿里爆款SpringBoot项目实战PDF+源码+视频分享
- 2024-11-14 Java网络编程实战:手撸简单的Web服务器
- 2024-11-14 Java高并发编程实战,那些年学过的锁
- 2024-11-14 神了!阿里P8纯手写出了这份10W字的MyBatis技术原理实战开发手册
- 2024-11-14 HR说你没有实战能力?100套Java项目集合,实践完以后让你变大神
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)