From 1f9bf62ee9c81ea9f90dfff2eeb5697ed713e89d Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 19 May 2017 17:28:12 +0200 Subject: [PATCH] IDEA-CR-21230 IDEA-173144 thread safe getCodeStyleSettings --- .../source/codeStyle/CodeStyleSchemeImpl.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java index c4c252dfa103..3340be9ea4ed 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java @@ -35,6 +35,8 @@ public class CodeStyleSchemeImpl extends ExternalizableSchemeAdapter implements private final boolean myIsDefault; private volatile CodeStyleSettings myCodeStyleSettings; + private final Object lock = new Object(); + CodeStyleSchemeImpl(@NotNull String name, String parentSchemeName, @NotNull SchemeDataHolder dataHolder) { setName(name); myDataHolder = dataHolder; @@ -79,26 +81,31 @@ public class CodeStyleSchemeImpl extends ExternalizableSchemeAdapter implements @Override @NotNull public CodeStyleSettings getCodeStyleSettings() { - SchemeDataHolder dataHolder = myDataHolder; - if (dataHolder == null) { - return myCodeStyleSettings; + CodeStyleSettings settings = myCodeStyleSettings; + if (settings != null) { + return settings; } - myDataHolder = null; - CodeStyleSettings settings = init(myParentSchemeName == null ? null : CodeStyleSchemesImpl.getSchemeManager().findSchemeByName(myParentSchemeName), dataHolder.read()); - dataHolder.updateDigest(this); - myParentSchemeName = null; + synchronized (lock) { + SchemeDataHolder dataHolder = myDataHolder; + if (dataHolder == null) { + return myCodeStyleSettings; + } + + myDataHolder = null; + settings = init(myParentSchemeName == null ? null : CodeStyleSchemesImpl.getSchemeManager().findSchemeByName(myParentSchemeName), dataHolder.read()); + dataHolder.updateDigest(this); + myParentSchemeName = null; + } return settings; } - boolean isInitialized() { - return myDataHolder == null; - } - public void setCodeStyleSettings(@NotNull CodeStyleSettings codeStyleSettings) { - myCodeStyleSettings = codeStyleSettings; - myParentSchemeName = null; - myDataHolder = null; + synchronized (lock) { + myCodeStyleSettings = codeStyleSettings; + myParentSchemeName = null; + myDataHolder = null; + } } @Override @@ -114,20 +121,27 @@ public class CodeStyleSchemeImpl extends ExternalizableSchemeAdapter implements @Nullable @Override public SchemeState getSchemeState() { - return isInitialized() ? SchemeState.POSSIBLY_CHANGED : SchemeState.UNCHANGED; + synchronized (lock) { + return myDataHolder == null ? SchemeState.POSSIBLY_CHANGED : SchemeState.UNCHANGED; + } } @Override @NotNull public Element writeScheme() { - if (myDataHolder == null) { + SchemeDataHolder dataHolder; + synchronized (lock) { + dataHolder = myDataHolder; + } + + if (dataHolder == null) { Element newElement = new Element("code_scheme"); newElement.setAttribute("name", getName()); myCodeStyleSettings.writeExternal(newElement); return newElement; } else { - return myDataHolder.read(); + return dataHolder.read(); } } }