Запретить доступ к методу, если другой поток вызывает другой метод

Предположим, у меня есть две темы, T1 и T2. Я хотел бы убедиться, что если T1 вызывает метод A1()то T2 не может вызвать метод B1(), Аналогично, если T1 вызывает метод A2()то T2 не должен вызывать метод B2(),

Как я могу достичь этого?

class A { 
    public void A1() {
    }

    public void A2() {
    }
}

class B {
    public void B1() {
    }

    public void B2() {
    }
}

1 ответ

Вы можете попробовать это так:

public static void main(String[] args) {
    final ReentrantReadWriteLock ONE = new ReentrantReadWriteLock();
    final ReentrantReadWriteLock TWO = new ReentrantReadWriteLock();

    Runnable t1 = new Runnable() {
        @Override public void run() {
            A a = new A();
            ONE.writeLock().lock();
            try { a.A1(); } finally { ONE.writeLock().unlock(); }
            TWO.writeLock().lock();
            try { a.A2(); } finally { TWO.writeLock().unlock(); }
        }
    };

    Runnable t2 = new Runnable() {
        @Override public void run() {
            B b = new B();
            ONE.writeLock().lock();
            try { b.B1(); } finally { ONE.writeLock().unlock(); }
            TWO.writeLock().lock();
            try { b.B2(); } finally { TWO.writeLock().unlock(); }
        }
    };
    new Thread(t1).start();
    new Thread(t2).start();
}

class A {
    public void A1() {
        System.out.println("A1");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
    public void A2() {
        System.out.println("A2");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
}

class B {
    public void B1() {
        System.out.println("B1");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
    public void B2() {
        System.out.println("B2");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
}

ВЫХОД:

A1
A2
B1
B2
Другие вопросы по тегам