diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/CodahaleMetricWriter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/CodahaleMetricWriter.java index 715fda3928..5f3b1cc0a5 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/CodahaleMetricWriter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/CodahaleMetricWriter.java @@ -90,25 +90,25 @@ public class CodahaleMetricWriter implements MetricWriter { } else { final double gauge = value.getValue().doubleValue(); - Object lock = null; - if (this.gaugeLocks.containsKey(name)) { - lock = this.gaugeLocks.get(name); - } - else { - this.gaugeLocks.putIfAbsent(name, new Object()); - lock = this.gaugeLocks.get(name); - } - // Ensure we synchronize to avoid another thread pre-empting this thread after // remove causing an error in CodaHale metrics // NOTE: CodaHale provides no way to do this atomically - synchronized (lock) { + synchronized (getGuageLock(name)) { this.registry.remove(name); this.registry.register(name, new SimpleGauge(gauge)); } } } + private Object getGuageLock(String name) { + Object lock = this.gaugeLocks.get(name); + if (lock == null) { + this.gaugeLocks.putIfAbsent(name, new Object()); + lock = this.gaugeLocks.get(name); + } + return lock; + } + @Override public void reset(String metricName) { this.registry.remove(metricName);