作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用下面的类来测量我的应用程序指标,其中我递增
和递减
指标。
public class AppMetrics {
private final AtomicLongMap<String> metricCounter = AtomicLongMap.create();
private static class Holder {
private static final AppMetrics INSTANCE = new AppMetrics();
}
public static AppMetrics getInstance() {
return Holder.INSTANCE;
}
private AppMetrics() {}
public void increment(String name) {
metricCounter.getAndIncrement(name);
}
public AtomicLongMap<String> getMetricCounter() {
return metricCounter;
}
}
我正在从多线程代码调用 AppMetrics
类的 increment
方法,以通过传递指标名称来增加指标。
问题陈述:
现在我想为每个 clientId
(一个字符串)提供 metricCounter
。这意味着我们还可以多次获取相同的 clientId
,有时它会是一个新的 clientId
,因此我需要以某种方式提取 metricCounter
映射对于该 clientId
并增加该特定 map 上的指标(我不知道如何做到这一点)。
记住它必须是线程安全的并且必须执行原子操作,正确的方法是什么。我正在考虑制作这样的 map :
private final Map<String, AtomicLongMap<String>> clientIdMetricCounterHolder = Maps.newConcurrentMap();
这是正确的方法吗?如果是,那么我如何通过传递 clientId
作为键来填充此映射,它的值将是每个指标的计数器映射。
我使用的是 Java 7。
最佳答案
如果您使用 map ,则需要同步创建新的 AtomicLongMap
实例。我建议使用 LoadingCache
代替。您最终可能不会使用任何实际的“缓存”功能,但“加载”功能非常有用,因为它将为您同步创建 AtomicLongMap
实例。例如:
LoadingCache<String, AtomicLongMap<String>> clientIdMetricCounterCache =
CacheBuilder.newBuilder().build(new CacheLoader<String, AtomicLongMap<String>>() {
@Override
public AtomicLongMap<String> load(String key) throws Exception {
return AtomicLongMap.create();
}
});
现在您可以安全地开始更新任何客户端的指标计数,而不必担心客户端是否是新的。例如
clientIdMetricCounterCache.get(clientId).incrementAndGet(metricName);
关于java - 如何以线程安全的方式填充字符串映射和另一个映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40983236/
我是一名优秀的程序员,十分优秀!