publicclassFooBar{privateint n;privateBlockingQueue<Integer> bar =newLinkedBlockingQueue<>(1);privateBlockingQueue<Integer> foo =newLinkedBlockingQueue<>(1);publicFooBar(int n){this.n = n;}publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n; i++){
foo.put(i);
printFoo.run();
bar.put(i);}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n; i++){
bar.take();
printBar.run();
foo.take();}}}
2.CyclicBarrier 控制先后
classFooBar6{privateint n;publicFooBar6(int n){this.n = n;}CyclicBarrier cb =newCyclicBarrier(2);volatileboolean fin =true;publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n; i++){while(!fin);
printFoo.run();
fin =false;try{
cb.await();}catch(BrokenBarrierException e){}}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n; i++){try{
cb.await();}catch(BrokenBarrierException e){}
printBar.run();
fin =true;}}}
3.自旋 + 让出CPU
classFooBar5{privateint n;publicFooBar5(int n){this.n = n;}volatileboolean permitFoo =true;publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n;){if(permitFoo){
printFoo.run();
i++;
permitFoo =false;}else{Thread.yield();}}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n;){if(!permitFoo){
printBar.run();
i++;
permitFoo =true;}else{Thread.yield();}}}}
4. 可重入锁 + Condition
classFooBar4{privateint n;publicFooBar4(int n){this.n = n;}Lock lock =newReentrantLock(true);privatefinalCondition foo = lock.newCondition();volatileboolean flag =true;publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n; i++){
lock.lock();try{while(!flag){
foo.await();}
printFoo.run();
flag =false;
foo.signal();}finally{
lock.unlock();}}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n;i++){
lock.lock();try{while(flag){
foo.await();}
printBar.run();
flag =true;
foo.signal();}finally{
lock.unlock();}}}}
5. synchronized + 标志位 + 唤醒
classFooBar3{privateint n;// 标志位,控制执行顺序,true执行printFoo,false执行printBarprivatevolatileboolean type =true;privatefinalObject foo=newObject();// 锁标志publicFooBar3(int n){this.n = n;}publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n; i++){synchronized(foo){while(!type){
foo.wait();}
printFoo.run();
type =false;
foo.notifyAll();}}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n; i++){synchronized(foo){while(type){
foo.wait();}
printBar.run();
type =true;
foo.notifyAll();}}}}
6. 信号量 适合控制顺序
classFooBar2{privateint n;privateSemaphore foo =newSemaphore(1);privateSemaphore bar =newSemaphore(0);publicFooBar2(int n){this.n = n;}publicvoidfoo(Runnable printFoo)throwsInterruptedException{for(int i =0; i < n; i++){
foo.acquire();
printFoo.run();
bar.release();}}publicvoidbar(Runnable printBar)throwsInterruptedException{for(int i =0; i < n; i++){
bar.acquire();
printBar.run();
foo.release();}}}