首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hazelcast中的线程安全计数器映射

Hazelcast中的线程安全计数器映射
EN

Stack Overflow用户
提问于 2013-09-14 09:50:34
回答 2查看 3.5K关注 0票数 4

我需要实现线程安全的集群宽计数器映射,所以我使用Hazelcast来使集群更宽,但不知道如何使其线程安全,我尝试使用AtomicInteger,但是看起来,当一个线程反序列化AtomicInteger以进行增量时,其他线程可能会增加,并将其放回映射中。你能给我提点建议吗?某种最佳做法?我认为我可以使用分布式锁来实现它,但不确定它是否是最好的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 11:13:08

我使用Hazelcast分布式任务完成了它,我已经实现了PartitionAware接口,因此这段代码将在计数器所在的节点上执行,因此所有分布式操作(锁、获取、放置、解锁)都将在本地执行,这将支持更高的并发性。

代码语言:javascript
复制
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);
    }
}
票数 7
EN

Stack Overflow用户

发布于 2018-01-08 11:06:19

我知道这是有点旧,但它作为我的搜索的最高结果。

我会考虑以下几点。

代码语言:javascript
复制
IAtomicLong counter = client.getAtomicLong("nameOfCounter");
Long incrementedValue = counter.incrementAndGet();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18800476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档