В Java, безопасно ли изменять ссылку на одновременное чтение HashMap

Надеюсь, это не слишком глупый вопрос ...

В моем проекте есть код, похожий на следующий:

public class ConfigStore {

    public static class Config {

        public final String setting1;
        public final String setting2;
        public final String setting3;

        public Config(String setting1, String setting2, String setting3) {
            this.setting1 = setting1;
            this.setting2 = setting2;
            this.setting3 = setting3;
        }

    }

    private volatile HashMap<String, Config> store = new HashMap<String, Config>();

    public void swapConfigs(HashMap<String, Config> newConfigs) {
        this.store = newConfigs;
    }

    public Config getConfig(String name) {
        return this.store.get(name);
    }

}

По мере обработки запросов каждый поток будет запрашивать конфигурацию для использования из магазин с помощью функции getConfig (). Однако периодически (скорее всего, каждые несколько дней) конфигурации обновляются и выгружаются с помощью функции swapConfigs (). Код, вызывающий swapConfigs (), не сохраняет ссылку на передаваемую ему карту, поскольку это просто результат синтаксического анализа файла конфигурации.

  • В этом случае ключевое слово volatile все еще необходимо для переменная экземпляра хранилища?
  • Будет ли ключевое слово volatile вводить какие-либо потенциальные узкие места производительности, о которых я должен знать или которых можно избежать, учитывая, что скорость чтения значительно превышает скорость записи?

Большое спасибо много,

14
задан Raedwald 20 June 2013 в 23:04
поделиться