- Hazelcast 教程
- Hazelcast - 首页
- Hazelcast - 简介
- Hazelcast - 设置
- Hazelcast - 第一个应用程序
- Hazelcast - 配置
- 设置多节点实例
- Hazelcast - 数据结构
- Hazelcast - 客户端
- Hazelcast - 序列化
- Hazelcast 高级特性
- Hazelcast - Spring 集成
- Hazelcast - 监控
- Map Reduce & 聚合
- Hazelcast - 集合监听器
- 常见问题 & 性能技巧
- Hazelcast 有用资源
- Hazelcast - 快速指南
- Hazelcast - 有用资源
- Hazelcast - 讨论
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) 原子地减去值并返回更新后的值 |