아래의 클래스에서 increment
및 decrement
메트릭을 사용하여 응용 프로그램 메트릭을 측정하려고합니다.문자열 맵과 다른 맵을 스레드로 안전하게 채우는 방법은 무엇입니까?
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;
}
}
내가 메트릭 이름을 전달하여 통계를 증가 increment
방법 멀티 스레드 코드에서 클래스 AppMetrics
의를 호출하고 있습니다.
문제 설명 :
는 지금은 문자열을 각 clientId
에 대한 metricCounter
을 갖고 싶어. 즉, 동일한 clientId
을 여러 번 가져올 수도 있고 때로는 새로운 clientId
이 될 수도 있습니다. 따라서 어쨌든 그 clientId
에 대한 metricCounter
지도를 추출해야하고 해당 특정지도의 메트릭을 증가시켜야합니다 (어떻게해야할지 모르겠습니다). 그).
염두에 두어야 할 올바른 방법은 스레드로부터 안전해야하며 원자 적 조작을 수행해야한다는 것입니다. 그 대신지도를 만들려고했습니다.
private final Map<String, AtomicLongMap<String>> clientIdMetricCounterHolder = Maps.newConcurrentMap();
올바른 방법인가요? 그렇다면 어떻게하면 clientId
을 키로 전달하여이지도를 채울 수 있으며 값은 각 측정 항목의 카운터지도가됩니다.
나는 자바 7
사용 computeIfAbsent() : http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html#computeIfAbsent-K-java.util.function.Function - –
죄송합니다. Java 7입니다. 죄송합니다. 언급하는 것을 잊어 버렸습니다. – john
동시 맵을 사용하는 것이 좋습니다.하지만 업데이트가 원자 적인지 확인하는 것이 더 까다 롭습니다. 특히 자바 8이 아닌 경우 특히 그렇습니다. – shmosel