importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassABC{//可重入锁privatefinalstaticLock lock =newReentrantLock();//判断是否执行:1表示应该A执行,2表示应该B执行,3表示应该C执行privatestaticint state =1;//condition对象privatestaticCondition a = lock.newCondition();privatestaticCondition b = lock.newCondition();privatestaticCondition c = lock.newCondition();publicstaticvoidprintA(){//通过循环,hang住线程for(int i =0; i <10; i++){try{//获取锁
lock.lock();//并发情况下,不能用if,要用循环判断等待条件,避免虚假唤醒while(state !=1){
a.await();}System.out.print("A");
state =2;
b.signal();}catch(InterruptedException e){
e.printStackTrace();}finally{//要保证不执行的时候,锁能释放掉
lock.unlock();}}}publicstaticvoidprintB()throwsInterruptedException{for(int i =0; i <10; i++){try{
lock.lock();//获取到锁,应该执行while(state !=2){
b.await();}System.out.print("B");
state =3;
c.signal();}finally{
lock.unlock();}}}publicstaticvoidprintC()throwsInterruptedException{for(int i =0; i <10; i++){try{
lock.lock();while(state !=3){
c.await();}//获取到锁,应该执行System.out.print("C");
state =1;
a.signal();}finally{
lock.unlock();}}}publicstaticvoidmain(String[] args){newThread(newRunnable(){@Overridepublicvoidrun(){ABC.printA();}},"A").start();newThread(newRunnable(){@Overridepublicvoidrun(){try{ABC.printB();}catch(InterruptedException e){
e.printStackTrace();}}},"B").start();newThread(newRunnable(){@Overridepublicvoidrun(){try{ABC.printC();}catch(InterruptedException e){
e.printStackTrace();}}},"C").start();}}
使用AtomicInteger
importjava.util.concurrent.atomic.AtomicInteger;publicclassABC2{privatestaticAtomicInteger state =newAtomicInteger(1);publicstaticvoidprintA(){for(int i =0; i <10; i++){while(true){if(state.get()==1){System.out.print("A");
state.incrementAndGet();break;}}}}publicstaticvoidprintB(){for(int i =0; i <10; i++){while(true){if(state.get()==2){System.out.print("B");
state.incrementAndGet();break;}}}}publicstaticvoidprintC(){for(int i =0; i <10; i++){while(true){if(state.get()==3){System.out.print("C");
state.set(1);break;}}}}publicstaticvoidmain(String[] args){newThread(newRunnable(){@Overridepublicvoidrun(){ABC2.printA();}},"A").start();newThread(newRunnable(){@Overridepublicvoidrun(){ABC2.printB();}},"B").start();newThread(newRunnable(){@Overridepublicvoidrun(){ABC2.printC();}},"C").start();}}