相对于 synchronized ,ReentrantLock具备如下特点
1.可中断
2.可以设置超时时间
3.可以设置为公平锁
4.支持多个条件变量
顺序打印-循环打印ABC
package test.example.juc;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
*@ClassName TestCircleABCByRTL
*@Description 通过reen
*@Author tangjian
*@Date 2022/5/24 9:57 下午
*@Version 1.0
**/
@Slf4j
public class TestCircleABCByRTL {
public static void main(String[] args) throws InterruptedException {
CirclePrinter circlePrinter = new CirclePrinter(5);
Condition conditionA = circlePrinter.newCondition();
Condition conditionB = circlePrinter.newCondition();
Condition conditionC = circlePrinter.newCondition();
new Thread(() -> {
circlePrinter.print("A", conditionA, conditionB);
}).start();
new Thread(() -> {
circlePrinter.print("B", conditionB, conditionC);
}).start();
new Thread(() -> {
circlePrinter.print("C", conditionC, conditionA);
}).start();
circlePrinter.startPrint(conditionA);
}
}
@Slf4j
class CirclePrinter extends ReentrantLock {
private int loopNumber;
public CirclePrinter(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String str , Condition current, Condition next) {
for (int i = 0; i < loopNumber; i++) {
this.lock();
try {
current.await();
Thread.sleep(200);
log.info(str);
next.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
this.unlock();
}
}
}
public void startPrint(Condition startCondition) {
this.lock();
try {
startCondition.signal();
} finally {
this.unlock();
}
}
}