Java 如果另一个线程正在调用另一个方法,则阻止对该方法的访问

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

假设我有两个线程,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 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的问题在这个问题上并不明确——有人建议,可能只有特定的线程应该受到影响。是的,你是对的。如果是这种情况,两个线程必须共享一个锁。