Distributed Atomic Long
分布式原子长整型
一个可以进行原子递增操作的计数器。
内部使用乐观锁实现,当失败时,再尝试加互斥排他锁。不论是乐观锁还是排他锁,都会按照重试策略进行重试操作。
1. 关键 API
org.apache.curator.framework.recipes.atomic.DistributedAtomicLong
org.apache.curator.framework.recipes.atomic.AtomicValue
org.apache.curator.framework.recipes.atomic.PromotedToLock
2. 机制说明
内部通过DistributedAtomicValue来实现分布式原子数据的操作。
使用乐观锁
先尝试无锁的版本更新
不行再尝试加锁,并再次重试
使用重试策略管理
需要检查返回值是否成功(类似mongodb)
3. 用法
3.1 创建
乐观锁模式
public DistributedAtomicLong(CuratorFramework client,
String counterPath,
RetryPolicy retryPolicy)
需要指定重试策略
排他锁模式
public DistributedAtomicLong(CuratorFramework client,
String counterPath,
RetryPolicy retryPolicy,
PromotedToLock promotedToLock)
需要指定重试策略
配置锁的相关信息
3.2 使用
对数值的操作:
get()
increment()
decrement()
add()
subtract()
检查结果
操作完之后,必须调用succeeded()进行检查
只有当返回true时,才能说明操作成功
如果操作成功,还可以:
preValue() 获取操作之前的值
postValue() 获取操作之后的值
4. 错误处理
这些原子实例的每一次方法调用都会访问ZK服务。所以,都会使用重试机制,而且一旦发生错误,就会抛出异常。
5. 源码分析
5.1 类定义
public interface DistributedAtomicNumber{}
public class DistributedAtomicLong implements DistributedAtomicNumber{}
实现了org.apache.curator.framework.recipes.atomic.DistributedAtomicNumber接口
定义了原子数值类型的基本操作api
AtomicValue add(T delta)
增加,并返回新值
AtomicValue compareAndSet(T expectedValue, T newValue)
CAS更新,并返回新值
AtomicValue decrement()
递减,并返回新值
void forceSet(T newValue)
强制覆盖更新
AtomicValue get()
获取当前值
AtomicValue increment()
递增,并返回新值
boolean initialize(T value)
初始化
如果设值成功,则返回true
如果节点已经存在,则返回false
AtomicValue subtract(T delta)
减去,并返回新值
AtomicValue trySet(T newValue)
尝试更新新值
需要调用AtomicValue.succeeded(),对操作结果进行检查
5.2 成员变量
public class DistributedAtomicLong implements DistributedAtomicNumber
{
private final DistributedAtomicValue value;
}
很简单,只定义了一个org.apache.curator.framework.recipes.atomic.DistributedAtomicValue
public class DistributedAtomicValue
{
private final Cura