Hazelcast - ICountDownLatch



java.util.concurrent.CountDownLatch 为线程提供了等待方式,而其他线程在 JVM 的多线程环境中完成一组操作。

类似地,ICountDownLatch 提供了 Java CountDownLatch 的分布式版本。它提供了类似的功能:setCount、countDown、await 等。

ICountDownLatch 和 Java CountDownLatch 之间的一个主要区别在于 Java CountDownLatch 提供了对单个 JVM 中线程的关键部分的保护,而 ICountDownLatch 为单个 JVM 和多个 JVM 中的线程提供了同步。

ICountDownLatch 有一个同步备份,这意味着如果我们有设置,例如,运行 5 个 JVM,则只有两个 JVM 将持有此锁定。

设置锁定及等待锁定

让我们在两个 JVM 上执行以下代码。一个上运行主代码,另一个上运行工作线程代码。此代码旨在让工作线程等待,直到主线程完成。

示例

第一部分是创建锁定并进行倒计时的主代码。

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast=Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   System.out.println("Setting counter");
   countDownLatch.trySetCount(2);
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   System.exit(0);
}

第二部分是创建锁定并进行倒计时的工作线程代码。

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   countDownLatch.await(5000, TimeUnit.MILLISECONDS);
   System.out.println("Worker successful");
   System.exit(0);
}

输出

代码的输出显示工作线程仅在倒计时完成到 0 之后才打印。

Setting counter
Counting down
Counting down
Worker successful

有用方法

序号 函数名称及说明
1

await()

等待锁定的计数达到零再继续

2

countDown()

递减倒计时锁定

3

trySetCount(int count)

设置锁定的计数

4

getCount()

获取锁定的当前计数

hazelcast_data_structures.htm
广告