夫陶公
清风
千古,余又何人,敢称庶几
个人博客地址:www.breez.work
CSDN:BreezAm
写法一:使用信号量Semaphore
public class Foo {
private Semaphore semaphoreB = new Semaphore(0);
private Semaphore semaphoreC = new Semaphore(0);
public Foo() {}
public void first() throws InterruptedException {
System.out.println("A");
semaphoreB.release();
}
public void second() throws InterruptedException {
semaphoreB.acquire();
System.out.println("B");
semaphoreC.release();
}
public void third() throws InterruptedException {
semaphoreC.acquire();
System.out.println("C");
}
}
复制代码
写法二:加synchronized锁
public class Foo {
private Object lock = new Object();
private boolean a;
private boolean b;
public Foo() {}
public void first() throws InterruptedException {
synchronized (lock) {
System.out.println("A");
a = true;
lock.notifyAll();
}
}
public void second() throws InterruptedException {
synchronized (lock) {
while (!a) {
lock.wait();
}
System.out.println("B");
b = true;
lock.notifyAll();
}
}
public void third() throws InterruptedException {
synchronized (lock) {
while (!b) {
lock.wait();
}
System.out.println("C");
}
}
}
复制代码
写法三:使用原子AtomicInteger
public class Foo {
private AtomicInteger a2 = new AtomicInteger(0);
private AtomicInteger a3 = new AtomicInteger(0);
public Foo() {}
public void first() throws InterruptedException {
System.out.println("A");
a2.incrementAndGet();
}
public void second() throws InterruptedException {
while (a2.get() != 1) {}
System.out.println("B");
a3.incrementAndGet();
}
public void third() throws InterruptedException {
while (a3.get() != 1) {}
System.out.println("C");
}
}
复制代码
写法四:使用队列BlockingQueue
public class Foo {
BlockingQueue<String> queue2 = new ArrayBlockingQueue<>(1);
BlockingQueue<String> queue3 = new ArrayBlockingQueue<>(1);
public Foo() {}
public void first() throws InterruptedException {
System.out.println("A");
queue2.offer("b");
}
public void second() throws InterruptedException {
while (queue2.size() == 0) {
}
System.out.println("B");
queue3.offer("c");
}
public void third() throws InterruptedException {
while (queue3.size() == 0) {
}
System.out.println("C");
}
}
复制代码
写法五:使用Condition
public class Foo {
private int number = 1;
private Lock lock = new ReentrantLock();
private Condition a = lock.newCondition();
private Condition b = lock.newCondition();
private Condition c = lock.newCondition();
public Foo() {}
public void first() throws InterruptedException {
lock.lock();
try {
while (number != 1) {
a.await();
}
System.out.println("A");
number = 2;
b.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void second() throws InterruptedException {
lock.lock();
try {
while (number != 2) {
b.await();
}
System.out.println("B");
number = 3;
c.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void third() throws InterruptedException {
lock.lock();
try {
while (number != 3) {
c.await();
}
System.out.println("C");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
复制代码
写法六:使用计数器CountDownLatch
public class Foo {
private CountDownLatch c2 = new CountDownLatch(1);
private CountDownLatch c3 = new CountDownLatch(1);
public Foo() {}
public void first() throws InterruptedException {
System.out.println("A");
c2.countDown();
}
public void second() throws InterruptedException {
c2.await();
System.out.println("B");
c3.countDown();
}
public void third() throws InterruptedException {
c3.await();
System.out.println("C");
}
}
复制代码
测试代码
public static void main(String[] args) throws InterruptedException {
Foo foo = new Foo();
new Thread(() -> {
try {
foo.first();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "A").start();
new Thread(() -> {
try {
foo.second();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "B").start();
new Thread(() -> {
try {
foo.third();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "C").start();
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END