Condition类的await()、signal()和signalAll()相当于 Object 的 wait()、notify()和notifyAll()
当Lock锁使用公平模式的时候,可以使用Condition的signal(),线程会按照FIFO的顺序冲await()中唤醒
我们根据结果可知,abcd的顺序并不是有序的,如果我们想让线程有序,必须用多个Condition条件来实现
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class B {public static void main(String[] args) {Data2 data = new Data2();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"A").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"B").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"C").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"D").start();}}// 判断等待,业务,通知class Data2{ // 数字 资源类private int number = 0;Lock lock = new ReentrantLock();Condition condition = lock.newCondition();//condition.await(); // 等待//condition.signalAll(); // 唤醒全部//+1public void increment() throws InterruptedException {lock.lock();try {// 业务代码while (number!=0){ //0// 等待condition.await();}number++;System.out.println(Thread.currentThread().getName()+"=>"+number);// 通知其他线程,我+1完毕了condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}//-1public void decrement() throws InterruptedException {lock.lock();try {while (number==0){ // 1// 等待condition.await();}number--;System.out.println(Thread.currentThread().getName()+"=>"+number);// 通知其他线程,我-1完毕了condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}
A=>1B=>0A=>1B=>0A=>1B=>0A=>1B=>0A=>1B=>0A=>1D=>0A=>1D=>0A=>1D=>0A=>1D=>0A=>1D=>0C=>1D=>0C=>1D=>0C=>1D=>0C=>1D=>0C=>1D=>0C=>1B=>0C=>1B=>0C=>1B=>0C=>1B=>0C=>1B=>0
