并发编程学习总结(八) :java中synchronized关键字使用详解 对象锁的相关条件的使用(2)
来源:互联网 发布:cs1.5优化参数 编辑:程序博客网 时间:2024/05/09 15:19
上一篇博客中主要学习了synchronized关键字使用对象锁和类锁 已经对象锁的一些简单特性。这篇文章中我们主要来学习一下对象锁的相关条件的使用。
我们知道显示锁ReentrantLock 有一个或多个相关的条件对象,而对象锁只有一个相关条件。
wait()方法添加一个线程到该条件的等待集中
notifyAll()/notity()方法解除等待线程的阻塞状态
当我们调用对象的相关条件的wait()/notifyAll()方法时,等价于调用显示锁lock的
lock.await()/lock.signalAll()方法。
下面我们直接使用对象锁的相关条件实现一个生产者和消费者案例,大家可以与我的另一篇博客对比并发编程学习总结(五) :java 显式锁ReentrantLock使用详解之条件对象(2)
public class SynchronizedTest3 {private Object object = new Object();private List<Integer> list = new ArrayList<Integer>();private boolean flag = true;// 这里我们使用object对象的锁,以及该锁的条件对象// 生产者线程一次生产一个数据5public void produce() throws InterruptedException {synchronized(object) {while(flag){if (list.size() > 0){object.wait();} else {list.add(5);System.out.println("生产者生产数据");object.notifyAll();}}}}// 消费者线程每次消费一个数据public void consume() throws InterruptedException {synchronized(object){while(flag){if (list.size() <= 0) {object.wait();} else {System.out.println(list.remove(0));System.out.println("消费者消费数据");object.notifyAll();}}}}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public static void main(String[] args) {// TODO Auto-generated method stubfinal SynchronizedTest3 test = new SynchronizedTest3();Thread t1 = new Thread(new Runnable() {public void run() {try {test.produce();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});Thread t2 = new Thread(new Runnable() {public void run() {try {test.consume();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});t1.start();t2.start();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}test.setFlag(false);}}
以上代码中我们使用的是Object object对象的锁及其相关条件来实现生产者和消费者模型案例。
生产者线程检查容器list中是否有数据,如果有数据则调用object.wait()使得生产者线程进入该条件的等待集中,如果容器中没有数据,则生产者线程生产数据放入list中,让后调用object.notifyAll()方法从该条件等待集中所有线程的阻塞状态。
消费者线程检查容器中是否有数据,如果有数据则消费数据然后调用notifyAll()方法,是的处于该条件等待集中的生产者线程解除阻塞状态。如果没有数据调用object.wait()方法是的消费者线程进入该条件的等待集中。
0 0
- 并发编程学习总结(八) :java中synchronized关键字使用详解 对象锁的相关条件的使用(2)
- 并发编程学习总结(七) :java中synchronized关键字使用详解(1)
- 并发编程学习总结(五) :java 显式锁ReentrantLock使用详解之条件对象(2)
- java并发编程 (一)synchronized关键字的使用
- java 使用synchronized关键字锁定的对象
- synchronized关键字详解 --Java并发编程的艺术
- Java中synchronized关键字的使用
- Java Synchronized关键字的使用
- java线程总结--synchronized关键字,原理以及相关的锁
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
- Java 多线程编程之三:synchronized 关键字的使用
- Java同步机制总结--synchronized关键字的使用
- Java Synchronized 和 Static 关键字的总结与使用
- Java关键字synchronized使用总结
- java并发编程学习之一段简单代码证明synchronized锁的是对象
- 黑马程序员-synchronized关键字的使用总结
- synchronized关键字的使用
- UVA 1262 Password
- 2016SDAU课程练习四1011 Problem K
- 循环链表的C语言实现
- C#读取系统文件信息(二)——调API读取系统文件及系统盘Icon图标
- 欢迎使用CSDN-markdown编辑器
- 并发编程学习总结(八) :java中synchronized关键字使用详解 对象锁的相关条件的使用(2)
- 双链表的C语言实现
- 各种资源网址
- 初识gcc编译过程
- Eclipse工程导入,找不到工程问题
- 人体的组成
- Java中Runnable和Thread区别
- 自定义拖拽cell
- 【Effective C++读书笔记】篇六(条款13~条款15)