diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java index d554562a7..310bc83a6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java @@ -56,6 +56,7 @@ import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.CorruptObjectException; @@ -97,9 +98,9 @@ public abstract class SystemReader { private static class Default extends SystemReader { private volatile String hostname; - private volatile FileBasedConfig systemConfig; + private AtomicReference systemConfig = new AtomicReference<>(); - private volatile FileBasedConfig userConfig; + private volatile AtomicReference userConfig = new AtomicReference<>(); @Override public String getenv(String variable) { @@ -113,10 +114,13 @@ public String getProperty(String key) { @Override public FileBasedConfig openSystemConfig(Config parent, FS fs) { - if (systemConfig == null) { - systemConfig = createSystemConfig(parent, fs); + FileBasedConfig c = systemConfig.get(); + if (c == null) { + systemConfig.compareAndSet(null, + createSystemConfig(parent, fs)); + c = systemConfig.get(); } - return systemConfig; + return c; } protected FileBasedConfig createSystemConfig(Config parent, FS fs) { @@ -142,40 +146,35 @@ public boolean isOutdated() { @Override public FileBasedConfig openUserConfig(Config parent, FS fs) { - if (userConfig == null) { - File home = fs.userHome(); - userConfig = new FileBasedConfig(parent, - new File(home, ".gitconfig"), fs); //$NON-NLS-1$ + FileBasedConfig c = userConfig.get(); + if (c == null) { + userConfig.compareAndSet(null, new FileBasedConfig(parent, + new File(fs.userHome(), ".gitconfig"), fs)); //$NON-NLS-1$ + c = userConfig.get(); } - return userConfig; + return c; } @Override public StoredConfig getSystemConfig() throws IOException, ConfigInvalidException { - if (systemConfig == null) { - systemConfig = createSystemConfig(null, FS.DETECTED); - } - if (systemConfig.isOutdated()) { + FileBasedConfig c = openSystemConfig(null, FS.DETECTED); + if (c.isOutdated()) { LOG.debug("loading system config {}", systemConfig); //$NON-NLS-1$ - systemConfig.load(); + c.load(); } - return systemConfig; + return c; } @Override public StoredConfig getUserConfig() throws IOException, ConfigInvalidException { - if (userConfig == null) { - userConfig = openUserConfig(getSystemConfig(), FS.DETECTED); - } else { - getSystemConfig(); - } - if (userConfig.isOutdated()) { + FileBasedConfig c = openUserConfig(getSystemConfig(), FS.DETECTED); + if (c.isOutdated()) { LOG.debug("loading user config {}", userConfig); //$NON-NLS-1$ - userConfig.load(); + c.load(); } - return userConfig; + return c; } @Override