Java 如果另一个线程正在调用另一个方法,则阻止对该方法的访问
假设我有两个线程,T1和T2。我想确保,如果T1调用方法A1,那么T2就不能调用方法B1。类似地,如果T1正在调用方法A2,那么T2应该不能调用方法B2 我怎样才能做到这一点Java 如果另一个线程正在调用另一个方法,则阻止对该方法的访问,java,multithreading,thread-synchronization,Java,Multithreading,Thread Synchronization,假设我有两个线程,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() { } } 您可以这样尝试: public s
class A {
public void A1() {
}
public void A2() {
}
}
class B {
public void B1() {
}
public void B2() {
}
}
您可以这样尝试:
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
从这里开始阅读:是否只有T1和T2被阻止访问方法很重要,还是所有其他线程都被阻止是可以接受的?后者更容易通过使用锁来实现。那些投票以“不清楚”结束的人会通过添加注释来帮助我们澄清问题。你能锁定同一个对象吗?值得注意的是,这会阻止所有代码在使用A2时访问B2。这可能没问题,但OP的问题在这个问题上并不明确——有人建议,可能只有特定的线程应该受到影响。是的,你是对的。如果是这种情况,两个线程必须共享一个锁。