我需要实现线程安全的集群宽计数器映射,所以我使用Hazelcast来使集群更宽,但不知道如何使其线程安全,我尝试使用AtomicInteger,但是看起来,当一个线程反序列化AtomicInteger以进行增量时,其他线程可能会增加,并将其放回映射中。你能给我提点建议吗?某种最佳做法?我认为我可以使用分布式锁来实现它,但不确定它是否是最好的解决方案。
发布于 2013-09-14 11:13:08
我使用Hazelcast分布式任务完成了它,我已经实现了PartitionAware接口,因此这段代码将在计数器所在的节点上执行,因此所有分布式操作(锁、获取、放置、解锁)都将在本地执行,这将支持更高的并发性。
public void track(final ip) {
try {
if(ip != null) {
executor.execute(new IncrementCounterDistributedTask<>(ip, IP_MAP_NAME));
}
} catch (RejectedExecutionException ignored) {
}
}
private static class IncrementCounterDistributedTask<K> implements Runnable, PartitionAware, Serializable {
private final K key;
private final String mapName;
public IncrementCounterDistributedTask(K key, String mapName) {
this.key = key;
this.mapName = mapName;
}
@Override
public Object getPartitionKey() {
return key;
}
@Override
public void run() {
IMap<K, Integer> map = Hazelcast.getMap(mapName);
map.lock(key);
Integer counter = map.get(key);
if(counter == null) {
map.put(key, 1);
} else {
map.put(key, ++counter);
}
map.unlock(key);
}
}发布于 2018-01-08 11:06:19
我知道这是有点旧,但它作为我的搜索的最高结果。
我会考虑以下几点。
IAtomicLong counter = client.getAtomicLong("nameOfCounter");
Long incrementedValue = counter.incrementAndGet();https://stackoverflow.com/questions/18800476
复制相似问题