From 49858a0ff1f9c6f823db7b38540fddcd289815b5 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 1 Dec 2014 13:58:18 -0800 Subject: [PATCH] Fix concurrent gaugeLocks map access Use putIfAbsent to ensure atomic creation of lock objects. Fixes gh-1995 --- .../metrics/writer/CodahaleMetricWriter.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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);