Tao Gong breeze through the ages, I who, dare to say a few ordinary

Personal Blog:www.breez.work CSDN:BreezAm


Notation 1: Use Semaphore

public class Foo {

    private Semaphore semaphoreB = new Semaphore(0);
    private Semaphore semaphoreC = new Semaphore(0);

    public Foo(a) {}

    public void first(a) throws InterruptedException {
        System.out.println("A");
        semaphoreB.release();
    }

    public void second(a) throws InterruptedException {
        semaphoreB.acquire();
        System.out.println("B");
        semaphoreC.release();
    }

    public void third(a) throws InterruptedException {
        semaphoreC.acquire();
        System.out.println("C"); }}Copy the code

Synchronized lock

public class Foo {

    private Object lock = new Object();
    private boolean a;
    private boolean b;

    public Foo(a) {}

    public void first(a) throws InterruptedException {
        synchronized (lock) {
            System.out.println("A");
            a = true; lock.notifyAll(); }}public void second(a) throws InterruptedException {
        synchronized (lock) {
            while(! a) { lock.wait(); } System.out.println("B");
            b = true; lock.notifyAll(); }}public void third(a) throws InterruptedException {
        synchronized (lock) {
            while(! b) { lock.wait(); } System.out.println("C"); }}}Copy the code

Use atomic AtomicInteger

public class Foo {

    private AtomicInteger a2 = new AtomicInteger(0);
    private AtomicInteger a3 = new AtomicInteger(0);

    public Foo(a) {}

    public void first(a) throws InterruptedException {
        System.out.println("A");
        a2.incrementAndGet();
    }

    public void second(a) throws InterruptedException {
        while(a2.get() ! =1) {}
        System.out.println("B");
        a3.incrementAndGet();
    }

    public void third(a) throws InterruptedException {
        while(a3.get() ! =1) {}
        System.out.println("C"); }}Copy the code

Use BlockingQueue

public class Foo {

    BlockingQueue<String> queue2 = new ArrayBlockingQueue<>(1);
    BlockingQueue<String> queue3 = new ArrayBlockingQueue<>(1);
    
    public Foo(a) {}

    public void first(a) throws InterruptedException {
        System.out.println("A");
        queue2.offer("b");
    }

    public void second(a) throws InterruptedException {
        while (queue2.size() == 0) {
        }
        System.out.println("B");
        queue3.offer("c");
    }

    public void third(a) throws InterruptedException {
        while (queue3.size() == 0) {
        }
        System.out.println("C"); }}Copy the code

Notation 5: Use 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(a) {}

    public void first(a) 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(a) 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(a) throws InterruptedException {
        lock.lock();
        try {
            while(number ! =3) {
                c.await();
            }
            System.out.println("C");
        } catch (Exception e) {
            e.printStackTrace();
        } finally{ lock.unlock(); }}}Copy the code

6. Use the counter CountDownLatch

public class Foo {

    private CountDownLatch c2 = new CountDownLatch(1);
    private CountDownLatch c3 = new CountDownLatch(1);

    public Foo(a) {}

    public void first(a) throws InterruptedException {
        System.out.println("A");
        c2.countDown();
    }

    public void second(a) throws InterruptedException {
        c2.await();
        System.out.println("B");
        c3.countDown();
    }

    public void third(a) throws InterruptedException {
        c3.await();
        System.out.println("C"); }}Copy the code

The test code

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();
    }
Copy the code