交替打印100个字母/交替打印循环100次(一共300个)
-
方案一.使用ReentrantLock + Condition
class ABCPrinter {//使用ReentrantLock + condition //这里指的是三个线程总共打印100个
private static final int PRINT_COUNT = 100;
private static volatile int count = 0;//静态保证类的所有对象都共享一份 volatile保证可见性,禁止指令重排序
private static final Lock lock = new ReentrantLock();
private static final Condition conditionA = lock.newCondition();
private static final Condition conditionB = lock.newCondition();
private static final Condition conditionC = lock.newCondition();
public static void main(String[] args) {
new Thread(() -> println("a", conditionA, conditionB)).start();
new Thread(() -> println("b", conditionB, conditionC)).start();
new Thread(() -> println("c", conditionC, conditionA)).start();
}
private static void println(String str, Condition current, Condition next) {
try {
lock.lock();
while (count < PRINT_COUNT) {
while (count % 3 != getThreadIndex(str)) {//套while循环 防止虚假唤醒
current.await();
}
if(count<PRINT_COUNT){//双重判断 防止最后阻塞的线程唤醒后 打印数字超过范围
System.out.println(Thread.currentThread().getName() + " : " + count +" : " + str);
}
count++;
next.signal();
}
} catch (InterruptedException e) {
e.printStackTr