交替打印FooBar

手写交替打印FooBar

//手太阴肺经 BLOCKING Queue
public class FooBar {
	 private int n;
	 private BlockingQueue<Integer> bar = new LinkedBlockingQueue<>(1);
	 private BlockingQueue<Integer> foo = new LinkedBlockingQueue<>(1);
	 public FooBar(int n) {
	 	this.n = n;
	 }
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 foo.put(i);
			 printFoo.run();
			 bar.put(i);
		 }
	 }
	 public void bar(Runnable printBar) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 bar.take();
			 printBar.run();
			 foo.take();
		 }
	 }
}
//手阳明大肠经CyclicBarrier 控制先后
class FooBar6 {
	 private int n;
	 public FooBar6(int n) {
	 	this.n = n;
	 }
	 CyclicBarrier cb = new CyclicBarrier(2);
	 volatile boolean fin = true;
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 while(!fin);
			 printFoo.run();
			 fin = false;
			 try {
			 	cb.await();
			 } catch (BrokenBarrierException e) {}
		 }
	 }
 	public void bar(Runnable printBar) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 try {
			 	cb.await();
			 } catch (BrokenBarrierException e) {}
			 printBar.run();
			 fin = true;
		 }
	 }
}
//手少阴心经 自旋 + 让出CPU
class FooBar5 {
	 private int n;
	 public FooBar5(int n) {
	 	this.n = n;
	 }
	 volatile boolean permitFoo = true;
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; ) {
			 if(permitFoo) {
				 printFoo.run();
				 i++;
				 permitFoo = false;
			 }else{
			 	Thread.yield();
			 }
		 }
	 }
	 public void bar(Runnable printBar) throws InterruptedException {
		 for (int i = 0; i < n; ) {
			 if(!permitFoo) {
				 printBar.run();
				 i++;
				 permitFoo = true;
			 }else{
			 	Thread.yield();
			 }
		 }
	 }
}
//手少阳三焦经 可重入锁 + Condition
class FooBar4 {
	 private int n;
	 public FooBar4(int n) {
	 	this.n = n;
	 }
	 Lock lock = new ReentrantLock(true);
	 private final Condition foo = lock.newCondition();
	 volatile boolean flag = true;
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 lock.lock();
			 try {
				 while(!flag) {
				 	foo.await();
				 }
				 printFoo.run();
				 flag = false;
				 foo.signal();
			 }finally {
			 	lock.unlock();
			 }
		 }
	 }
	 public void bar(Runnable printBar) throws InterruptedException {
		 for (int i = 0; i < n;i++) {
			 lock.lock();
			 try {
				 while(flag) {
				 	foo.await();
				 }
				 printBar.run();
				 flag = true;
				 foo.signal();
			 }finally {
			 	lock.unlock();
			 }
		 }
	 }
}
//手厥阴心包经 synchronized + 标志位 + 唤醒
class FooBar3 {
	 private int n;
	 // 标志位,控制执行顺序,true执行printFoo,false执行printBar
	 private volatile boolean type = true;
	 private final Object foo= new Object(); // 锁标志
	 public FooBar3(int n) {
	 	this.n = n;
	 }
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 synchronized (foo) {
				 while(!type){
				 	foo.wait();
				 }
				 printFoo.run();
				 type = false;
				 foo.notifyAll();
			 }
		 }
	 }
	 public void bar(Runnable printBar) throws InterruptedException {
	 	for (int i = 0; i < n; i++) {
		 	synchronized (foo) {
		 		while(type){
		 			foo.wait();
		 		}
		 		printBar.run();
		 		type = true;
		 		foo.notifyAll();
		 	}
	 	}
 	}
}
//手太阳小肠经 信号量 适合控制顺序
class FooBar2 {
	 private int n;
	 private Semaphore foo = new Semaphore(1);
	 private Semaphore bar = new Semaphore(0);
	 public FooBar2(int n) {
	 	this.n = n;
	 }
	 public void foo(Runnable printFoo) throws InterruptedException {
		 for (int i = 0; i < n; i++) {
			 foo.acquire();
			 printFoo.run();
			 bar.release();
		 }
	 }
 	public void bar(Runnable printBar) throws InterruptedException {
	 	for (int i = 0; i < n; i++) {
		 	bar.acquire();
		 	printBar.run();
		 	foo.release();
	 	}
 	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值