使用CountDownLatch
可以实现一种等待/通知机制,但它与对象锁(synchronized
)的用途和行为有所不同。CountDownLatch
主要用于使一个或多个线程等待其他线程完成一系列操作。当你提到“方法A调用时,对象锁锁着,方法B等待释放”,这通常是指通过synchronized
块或方法来实现的互斥访问。
不过,如果你想要利用CountDownLatch
来实现一种类似的效果,即让方法B等待方法A完成某个操作后再执行,那么可以这样使用CountDownLatch
:
public class Example {
// 定义锁对象
private final CountDownLatch latch = new CountDownLatch(1);
// 方法A
public void methodA() {
try {
// 执行一些操作
System.out.println("Method A is running.");
// 假设这里有一些耗时操作
Thread.sleep(2000); // 模拟耗时操作
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 通知等待的线程,方法A已经完成相关操作
latch.countDown();
}
}
// 方法B
public void methodB() {
try {
// 等待方法A完成操作
latch.await();
// 方法A完成操作后,继续执行方法B的后续操作
System.out.println("Method B is running after method A.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) {
Example example = new Example();
// 创建线程A,执行方法A
Thread threadA = new Thread(() -> {
example.methodA();
});
// 创建线程B,执行方法B
Thread threadB = new Thread(() -> {
example.methodB();
});
// 启动线程B和线程A
threadB.start();
threadA.start();
}
}
在这个示例中,CountDownLatch
被初始化为1,表示有一个计数器需要被减到0。方法A在完成其操作后调用countDown()
方法,将计数器减1。方法B在执行时调用await()
方法,这将导致方法B所在的线程等待,直到计数器被减到0。这样,方法B就会等待方法A完成操作后再继续执行。
CountDownLatch
是一次性的,一旦计数器减到0,它就不能再次使用。如果你需要多次使用类似的等待/通知机制,可能需要考虑其他工具,如CyclicBarrier
或Semaphore
。