Запретить доступ к методу, если другой поток вызывает другой метод
Предположим, у меня есть две темы, 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