Hazelcast - IAtomicLong



Java 中的 Atomic Long 数据结构提供了一种线程安全的方式来使用 Long。

类似地,IAtomicLong 更像是一个 AtomicLong 的分布式版本。它提供了类似的功能,其中以下一些是有用的:set、get、getAndSet、incrementAndGet。这里需要注意的一点是,由于数据结构分布在多台机器上,以上函数的性能可能并不相同。

AtomicLong 只有一个同步备份,这意味着如果我们的设置中运行着 5 个 JVM,那么只有两个 JVM 会保存此变量。

让我们来看一些有用的函数。

初始化并将值设置为 IAtomicLong

示例

public class Application {
   public static void main(String... args) throws IOException {
      //initialize hazelcast instance and the counter variable
      Hazelcast – Data Structures
      HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
      IAtomicLong counter = hazelcast.getAtomicLong("counter");
      System.out.println(counter.get());
      counter.set(2);
      System.out.println(counter.get());
      System.exit(0);
   }
}

输出

执行上述代码时,将产生以下输出

0
2

跨 JVM 的同步

Atomic Long 提供跨 JVM 的并发控制。因此,incrementAndGet、compareAndSet 等方法可以用来原子地更新计数器。

示例

让我们在两个 JVM 上同时执行下面的代码

public class AtomicLong2 {
   public static void main(String... args) throws IOException,
   InterruptedException {
      // initialize hazelcast instance
      HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
      IAtomicLong counter = hazelcast.getAtomicLong("counter");
      for(int i = 0; i < 1000; i++) {
         counter.incrementAndGet();
      }
      System.exit(0);
   }
}

输出

上述代码输出的第二行将始终为:

2000

如果 incrementAndGet() 不是线程安全的,上述代码可能不会始终输出 2000。它可能小于 2000,因为一个线程的写入可能被另一个线程覆盖。

常用方法

序号 函数名称 & 描述
1

get()

返回当前值

2

set(long newValue)

将值设置为 newValue

3

addAndGet(long value)

原子地添加值并返回更新后的值

4

decrementAndGet(long value)

原子地减去值并返回更新后的值

5

getAndAdd(long value)

原子地返回当前值并存储当前值和值的和

6

getAndDecrement(long value)

原子地返回当前值并存储当前值减去值的结果

7

compareAndSet(long expected,long newValue)

如果 oldValue 等于 expected 值,则原子地将值设置为 newValue

8

decrementAndGet(long value)

原子地减去值并返回更新后的值

广告