Java并发(思维导图)【待评估、删除】
1,
2,
3,常用函数
Semaphore
import java.util.concurrent.Semaphore;
Semaphore name=new Semaphore(n); name.acquire(n1); acquire.release(n2);
lock中的wait,notify,notifyAll
4,相关例题
Answer-1:
解决办法:
注意这里使用lock-synchronized同步以及屏障
package com.cnblogs.mufasa.demo1.Answer1114; class Foo { private boolean firstBlock; private boolean secondBlock; private Object lock=new Object(); public Foo() { } public void first(Runnable printFirst) throws InterruptedException { synchronized(lock){ // printFirst.run() outputs "first". Do not change or remove this line. printFirst.run(); firstBlock=true; lock.notifyAll(); } } public void second(Runnable printSecond) throws InterruptedException { synchronized(lock){ while(!firstBlock){ lock.wait(); } // printSecond.run() outputs "second". Do not change or remove this line. printSecond.run(); secondBlock=true; lock.notifyAll(); } } public void third(Runnable printThird) throws InterruptedException { synchronized(lock){ while(!secondBlock){ lock.wait(); } // printThird.run() outputs "third". Do not change or remove this line. printThird.run(); } } }
Answer-2:
解决方法:
①定义一个布尔标识符flag,决定轮替输出;
②设置一个lock-synchronized同步;
package com.cnblogs.mufasa.demo1.Answer1115; class FooBar { private int n; private boolean flag=false;//定义一个布尔标识位 private Object lock=new Object();//同步锁 public FooBar(int n) { this.n = n; } public void foo(Runnable printFoo) throws InterruptedException { for (int i = 0; i < n; i++) { synchronized (lock){ while (flag){ lock.wait(); } // printFoo.run() outputs "foo". Do not change or remove this line. printFoo.run(); flag=true; lock.notifyAll(); } } } public void bar(Runnable printBar) throws InterruptedException { for (int i = 0; i < n; i++) { synchronized (lock) { while (!flag) { lock.wait(); } // printBar.run() outputs "bar". Do not change or remove this line. printBar.run(); flag=false; lock.notifyAll(); } } } }
探究未知是最大乐趣