1114、按顺序打印
synchronized Method
class Foo {
private boolean oneDone;
private boolean twoDone;
public Foo() {
oneDone = false;
twoDone = false;
}
public synchronized void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
oneDone = true;
notifyAll();
}
public synchronized void second(Runnable printSecond) throws InterruptedException {
while (!oneDone) {
wait();
}
printSecond.run();
twoDone = true;
notifyAll();
}
public synchronized void third(Runnable printThird) throws InterruptedException {
while (!twoDone) {
wait();
}
printThird.run();
}
}
作者:map2024
链接:https://leetcode.cn/problems/print-in-order/solutions/2301545/ban-yun-javage-chong-xie-fa-by-dbj98-x48-5hod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Synchronized on Object:
class Foo {
private Object lock;
private boolean oneDone;
private boolean twoDone;
public Foo() {
lock = new Object();
oneDone = false;
twoDone = false;
}
public void first(Runnable printFirst) throws InterruptedException {
synchronized (lock) {
printFirst.run();
oneDone = true;
lock.notifyAll();
}
}
public void second(Runnable printSecond) throws InterruptedException {
synchronized (lock) {
while (!oneDone) {
lock.wait();
}
printSecond.run();
twoDone = true;
lock.notifyAll();
}
}
public void third(Runnable printThird) throws InterruptedException {
synchronized (lock) {
while (!twoDone) {
lock.wait();
}
printThird.run();
}
}
}
作者:map2024
链接:https://leetcode.cn/problems/print-in-order/solutions/2301545/ban-yun-javage-chong-xie-fa-by-dbj98-x48-5hod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Semaphore:
为啥信号量这个效果这么差
class Foo {
private Semaphore s2;
private Semaphore s3;
public Foo() {
s2 = new Semaphore(0);
s3 = new Semaphore(0);
}
public void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
s2.release();
}
public void second(Runnable printSecond) throws InterruptedException {
s2.acquire();
printSecond.run();
s3.release();
}
public void third(Runnable printThird) throws InterruptedException {
s3.acquire();
printThird.run();
}
}
作者:map2024
链接:https://leetcode.cn/problems/print-in-order/solutions/2301545/ban-yun-javage-chong-xie-fa-by-dbj98-x48-5hod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Condition Variable: ReentrantLock
class Foo {
private Lock lock;
private boolean oneDone;
private boolean twoDone;
private Condition one;
private Condition two;
public Foo() {
lock = new ReentrantLock();
one = lock.newCondition();
two = lock.newCondition();
oneDone = false;
twoDone = false;
}
public void first(Runnable printFirst) throws InterruptedException {
lock.lock();
try {
printFirst.run();
oneDone = true;
one.signal();
} finally {
lock.unlock();
}
}
public void second(Runnable printSecond) throws InterruptedException {
lock.lock();
try {
while (!oneDone) {
one.await();
}
printSecond.run();
twoDone = true;
two.signal();
} finally {
lock.unlock();
}
}
public void third(Runnable printThird) throws InterruptedException {
lock.lock();
try {
while (!twoDone) {
two.await();
}
printThird.run();
} finally {
lock.unlock();
}
}
}
作者:map2024
链接:https://leetcode.cn/problems/print-in-order/solutions/2301545/ban-yun-javage-chong-xie-fa-by-dbj98-x48-5hod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
CountDownLatch:
class Foo {
private CountDownLatch latch1;
private CountDownLatch latch2;
public Foo() {
latch1 = new CountDownLatch(1);
latch2 = new CountDownLatch(1);
}
public void first(Runnable printFirst) throws InterruptedException {
// printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
latch1.countDown();
}
public void second(Runnable printSecond) throws InterruptedException {
latch1.await();
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
latch2.countDown();
}
public void third(Runnable printThird) throws InterruptedException {
latch2.await();
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}
作者:map2024
链接:https://leetcode.cn/problems/print-in-order/solutions/2301545/ban-yun-javage-chong-xie-fa-by-dbj98-x48-5hod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
LockSupport:
private volatile Thread thread2, thread3; //不加volatile线程读取不到其他线程的写修改导致超时
public Foo() {
thread2 = null;
thread3 = null;
}
public void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
while (thread2 == null) {;}
LockSupport.unpark(thread2);
}
public void second(Runnable printSecond) throws InterruptedException {
thread2 = Thread.currentThread();
LockSupport.park();
printSecond.run();
while (thread3 == null) {;}
LockSupport.unpark(thread3);
}
public void third(Runnable printThird) throws InterruptedException {
thread3 = Thread.currentThread();
LockSupport.park();
printThird.run();
}
1115、交替打印
//手太阴肺经 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();
}
}
}
作者:smile
链接:https://leetcode.cn/problems/print-foobar-alternately/solutions/542996/duo-xian-cheng-liu-mai-shen-jian-ni-xue-d220n/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。