并发编程学习总结(八) :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
原创粉丝点击