public class SpringBootTestApplicationDemo {
public static void main(String[] args) {
DataResource dataResource = new DataResource();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
dataResource.printA();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
dataResource.printB();
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
dataResource.printC();
}
}, "C").start();
}
}
/**
* Condition实现指定唤醒
*/
class DataResource{
private Integer number = 1;
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
public void printA(){
lock.lock();
try {
while (number != 1){
conditionA.await();
}
System.out.println(Thread.currentThread().getName() + "====>AAA");
number = 2;
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
while (number != 2){
conditionB.await();
}
System.out.println(Thread.currentThread().getName() + "====>BBB");
number = 3;
conditionC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
while (number != 3){
conditionC.await();
}
System.out.println(Thread.currentThread().getName() + "====>CCC");
number = 1;
conditionA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
打印结果:
A====>AAA
B====>BBB
C====>CCC
A====>AAA
B====>BBB
C====>CCC....................
继续按照ABC顺序打印
拓展:
while (number != 1){
conditionA.await();
}在多线程情况下,synchronized 传统的写法方式,不能使用 if 判断 缓冲资源 ,可能导致缓冲资源数据不准确