From cfa8e290a5f24f8c6605ea20e6a2d8b28238c68b Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Sun, 7 Aug 2022 11:43:08 -0700 Subject: [PATCH] Double-checked locking for `WebApp#classMap` --- .../main/java/org/kohsuke/stapler/WebApp.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/kohsuke/stapler/WebApp.java b/core/src/main/java/org/kohsuke/stapler/WebApp.java index 69feff2447..172df2ab8b 100644 --- a/core/src/main/java/org/kohsuke/stapler/WebApp.java +++ b/core/src/main/java/org/kohsuke/stapler/WebApp.java @@ -218,26 +218,32 @@ public void setClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } - public MetaClass getMetaClass(Class c) { - return getMetaClass(Klass.java(c)); - } - - public MetaClass getMetaClass(Klass c) { - if(c==null) return null; - if (c.navigator == KlassNavigator.JAVA) { - ClassValue _classMap; + private ClassValue getClassMap() { + ClassValue _classMap = classMap; + if (_classMap == null) { synchronized (this) { - if (classMap == null) { - classMap = new ClassValue() { + _classMap = classMap; + if (_classMap == null) { + classMap = _classMap = new ClassValue<>() { @Override protected MetaClass computeValue(Class c) { return new MetaClass(WebApp.this, Klass.java(c)); } }; } - _classMap = classMap; } - return _classMap.get(c.toJavaClass()); + } + return _classMap; + } + + public MetaClass getMetaClass(Class c) { + return getMetaClass(Klass.java(c)); + } + + public MetaClass getMetaClass(Klass c) { + if(c==null) return null; + if (c.navigator == KlassNavigator.JAVA) { + return getClassMap().get(c.toJavaClass()); } else { // probably now impossible outside tests return new MetaClass(this,c);