public class LockTest {
public static void main(String[] args) {
lockB lockB=new lockB();
new Thread(()->{
try {
for(int i=0;i<30;i++){
lockB.printA();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
for(int i=0;i<30;i++){
lockB.printB();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
for(int i=0;i<30;i++){
lockB.printC();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
class lockB{
Lock lock=new ReentrantLock();
Condition condition1=lock.newCondition();
Condition condition2=lock.newCondition();
Condition condition3=lock.newCondition();
int flag=1;
public void printA() throws InterruptedException {
lock.lock();
while(flag!=1){
condition1.await();
}
System.out.println("A");
flag++;
condition2.signal();
lock.unlock();
}
public void printB() throws InterruptedException {
lock.lock();
while(flag!=2){
condition2.await();
}
System.out.println("B");
flag++;
condition3.signal();
lock.unlock();
}
public void printC() throws InterruptedException {
lock.lock();
while(flag!=3){
condition3.await();
}
System.out.println("C");
flag++;
lock.unlock();
}
}