Java并发程序设计(16)并发锁之条件变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发程序设计(16)并发锁之条件变量相关的知识,希望对你有一定的参考价值。
1.1.1. 条件变量应用之等待通知
条件变量Condition提供了一种基于ReentrantLock的事件等待和通知的机制,并且可以监控任意指定的条件,在条件不满足时等待条件满足,其它线程在条件满足时可以通知等待条件的线程,从而唤醒等待中的线程。
下面的代码实现了两件工作分别由两个线程轮流不断执行的效果。
package com.test.concurrence; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionTest { static class Worker { public void work(int who ,int next, int count){ //获取锁 lock.lock(); try { //等待条件成立:turn等于who while(who != turn){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } //条件已满足,开始做要做的事情 for(int i=0;i<count;i++){ System.out.println( who + " : running " + i + " / " + count ); } //暂停1秒。 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //改变条件。 turn = next; //通知下一个工人开始工作。 condition.signal(); }finally{ //释放锁。 lock.unlock(); } } //所使用的锁。 private Lock lock = new ReentrantLock(); //条件变量。 private Condition condition = lock.newCondition(); //条件要监控的变量。 private volatile int turn = 0; } public static void main(String[] args) { final int WORKER_A = 0; final int WORKER_B = 1; final int COUNT = 10; final Worker worker = new Worker(); new Thread( new Runnable(){ @Override public void run() { while(true){ worker.work( WORKER_A, WORKER_B, COUNT); } } }).start(); new Thread( new Runnable(){ @Override public void run() { while(true){ worker.work( WORKER_B, WORKER_A, COUNT); } } }).start(); } }
运行结果如下所示:
0 : running 0 / 10
0 : running 1 / 10
0 : running 2 / 10
0 : running 3 / 10
0 : running 4 / 10
0 : running 5 / 10
0 : running 6 / 10
0 : running 7 / 10
0 : running 8 / 10
0 : running 9 / 10
1 : running 0 / 10
1 : running 1 / 10
1 : running 2 / 10
1 : running 3 / 10
1 : running 4 / 10
1 : running 5 / 10
1 : running 6 / 10
1 : running 7 / 10
1 : running 8 / 10
1 : running 9 / 10
0 : running 0 / 10
0 : running 1 / 10
0 : running 2 / 10
0 : running 3 / 10
0 : running 4 / 10
0 : running 5 / 10
0 : running 6 / 10
0 : running 7 / 10
0 : running 8 / 10
0 : running 9 / 10
以上是关于Java并发程序设计(16)并发锁之条件变量的主要内容,如果未能解决你的问题,请参考以下文章
Java并发程序设计(21)并发锁之交换器Exchanger
Java并发程序设计(20)并发锁之倒数锁CountDownLatch
Java并发程序设计(12)并发锁之可重入锁ReentrantLock