我想实现一个共享对象,用于计算操作执行的统计信息。
对象状态将由Map<String,AtomicInteger>表示(键是操作的名称,值是执行操作的次数)。我是否正确,我可以选择HashMap<String,AtomicInteger>实现,并且不对其进行同步以从中获取值,因为AtomicInteger在其下方具有易失的value字段。

对执行状态进行加法和递增的代码示例:

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

public final class Stats {

private final Map<String, AtomicInteger> statistics = new HashMap<String, AtomicInteger>();

public int increment(String operationName) {
    if (!statistics.containsKey(operationName)) {
        synchronized (statistics) {
            if (!statistics.containsKey(operationName))
                statistics.put(operationName, new AtomicInteger(0));
        }
    }

    return statistics.get(operationName).getAndIncrement();
}

public int getOpStats(String operationName) {
    if (!statistics.containsKey(operationName)) {
        return 0;
    }
    return statistics.get(operationName).get();
}

}

最佳答案

如果您想在计数器初始化方面保持线程安全,则应使用ConcurrentHashMap并始终以这种方式实例化和增加计数器:

themap.putIfAbsent("the name", new AtomicInteger(0));
themap.get("the name").incrementAndGet();

您还可以确保在开始之前初始化所有使用的计数器,并且只使用您喜欢的任何集合。鉴于您知道从哪里看,普通的AtomicInteger[] -array最快,所以HashTable可能比HashMap快一点。

如果您事先知道拥有哪些计数器,则还可以定义所有计数器名称的java enum并使用EnumMap<YourCountersEnum, AtomicInteger>。这可能会使查询性能接近AtomicInteger[] -array查询。

关于java - AtomicInteger map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21222832/

10-09 04:48