------- android培训、java培训、期待与您交流! ----------
生产者消费者例子
- 生产者消费者例子:有多个生产者、多个消费者同时操作资源
1.Java1.5版本以前的生产者消费者例子
- 多个(大于2个)线程同时操作资源会出现以下几种问题
- 产生原因
- 原因1就是线程唤醒时,可能唤醒本身线程,导致数据错乱:多次生产、多次消费。
- 原因2就是if判断标记时,if判断了一次后线程wait,被唤醒后没有判断标记。
- 解决方法
- 解决原因1就是把唤醒(notify),改为唤醒全部(notifyAll),唤醒全部。
- 解决原因2就是用while判断标记,while可以保证线程每次被唤醒都会重新判断标记。
- 两个方法必须同时进行。
- 关键字:notifyAll唤醒所有线程,while每次唤醒都判断标记。
- 2.代码如下
2.Java1.5版本提供了多线程升级解决方案
- 将同步synchronized替换成了显式Lock操作。
- 将Object中的wait,notify notifyAll,替换成了Condition对象。该对象可以通过Lock锁进行获取。
Lock
替代了synchronized
方法和语句的使用,Condition
替代了
Object 监视器方法的使用。
- 一个锁里可以有多个Condition,代表多个线程。
- 该示例实现了只唤醒对方,而不是全部唤醒。
-
- 1.5版本多线程新特性:显式的锁机制,以及显式的锁机制上的唤醒、等待机制。一个锁对应多个Condition。
-
- 定义锁、定义锁的两个Condition、定义资源的set方法 代码如下
- 注意:释放锁的finally一定要执行。
- 为什么Lock不会死锁。
- 因为Lock只有一个锁,当然不会死锁。
condition只是一个条件,这个条件可以认为是一个标记,具体是通过代码实现的。
condition是一个接口,通过Lock的newCondition与Lock绑在一块。
一个锁可以绑多个condition。
一个锁有多个条件,每个条件下面有多个线程,可以精确处理这个条件下的线程,让他们等待、唤醒等。
synchronized就不可以,因为它的等待、唤醒等都是使用的Object的方法,处理很粗糙。
才会出现同时唤醒所有,同时等待所有的情况,不能分条件处理。
condition很抽象,它不是自然事物,而是一种代码控制手段。
分享到:
相关推荐
黑马QT讲义,适合QT入门,使用,教程很比较基础,新手可以看看,另外视频链接在哔哩哔哩中。
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
黑马程序员-SpringCloud-学习笔记01-认识微服务
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...
黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
黑马程序员-梅兰商城项目实战,包含图片素材和编写源码。
黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
C++黑马程序员-演讲比赛流程管理系统记录
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901
黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490903
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...