Condition下的await()和signal()与传统Synchronized的wait()和notify()有不同,Condition可以进行精准唤醒
public class PCLockDemo2 {
public static void main(String[] args) {
Resource r = new Resource();
new Thread(()->{
for (int i = 0; i < 20; i++) {
r.a();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 20; i++) {
r.b();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 20; i++) {
r.c();
}
},"C").start();
}
}
class Resource{
private int num = 1;
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void a(){
try{
lock.lock();
while(num != 1){
try {
c1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"AAAAAA");
num = 2;
c2.signal();
}finally {
lock.unlock();
}
}
public void b(){
try{
lock.lock();
while(num != 2){
try {
c2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"BBBBBB");
num = 3;
c3.signal();
}finally {
lock.unlock();
}
}
public void c(){
try{
lock.lock();
while(num != 3){
try {
c3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"CCCCC");
num = 1;
c1.signal();
}finally {
lock.unlock();
}
}
}