1、获取lock锁对象
2、通过lock锁对象创建Condition实例绑定到lock锁对象上
3、上锁:lock.lock()
4、try…catch执行业务
5、finally中释放锁:lock.unlock()
package com.han.demo01;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class TestLock {public static void main(String[] args) {Data01 data = new Data01();new Thread(() -> {for (int i = 0; i < 20; i++) {data.increment();}}, "A").start();new Thread(() -> {for (int i = 0; i < 20; i++) {data.increment();}}, "C").start();new Thread(() -> {for (int i = 0; i < 20; i++) {data.decrement();}}, "B").start();new Thread(() -> {for (int i = 0; i < 20; i++) {data.decrement();}}, "D").start();}
}class Data01 {private int num = 0;Lock lock = new ReentrantLock();Condition condition = lock.newCondition();//等待、业务、唤醒public void increment() {lock.lock();try {while (num != 0) {condition.await();}num++;System.out.println(Thread.currentThread().getName() + "==>" + num);//通知其他线程,我+1完毕了condition.signalAll();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}//等待、业务、唤醒public void decrement() {lock.lock();try {while (num == 0) {condition.await();}num--;System.out.println(Thread.currentThread().getName() + "==>" + num);//通知其他线程,我-1完毕了condition.signalAll();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}