两种方法大致相同,只是CountDownLatch仅可释放一次。之后,所有的await()调用都会立即返回。因此,如果您正在使用可能会中断的服务,则CyclicBarrier实际上可能更合适。
如果您的条件确实是一次性的交易,那么FutureTask会更合适。您可以调用get(),它将等待服务变得可用,然后可以在get()返回时立即使用该服务。
您提到CountDownLatch允许不使用锁而等待。但是,CountDownLatch和ReentrantLock都是使用AbstractQueuedSynchronizer实现的。在幕后,它们提供了相同的同步和可见性语义。



