В someParameters HashMap загружается из CSV-файла через каждые двадцать минут или около одной нити и устанавливается SetParameters метода.поточно-перенастройки ссылки объекта
Это очень часто читается несколькими потоками, вызывающими getParameters: выполнить перевод перевода одного значения в соответствующее значение.
Является ли код небезопасным и/или «неправильным» способом достижения этого (особенно с точки зрения производительности)? Я знаю о ConcurrentHashMap, но я пытаюсь получить более фундаментальное понимание параллелизма, вместо того, чтобы использовать классы, которые по сути являются потокобезопасными.
Один потенциальный риск, который я вижу в том, что ссылка на объект someParameters может быть сброшен в то время как другой поток читает копию, так как другой поток не может иметь последние значения (которое не имело бы значения для меня).
public class ConfigObject {
private static HashMap<String, String> someParameters = new HashMap<String, String>();
public HashMap<String, String> getParameters(){
return new HashMap<String, String>(someParameters);
//to some thread which will only ever iterate or get
}
public void setParameters(HashMap<String, String> newParameters){
//could be called by any thread at any time
someParameters = newParameters;
}
}
создание совершенно нового хэшмапа для возврата из getParameters - действительно дорогое решение. Лучше всего было бы использовать Collections.unmodifiableMap – ControlAltDel
Назначение - это атомный оператор, поэтому здесь нет проблем с потоком. – ControlAltDel
@ControlAltDel Threading ** ** здесь проблема: все дело в видимости, а не в атомарности (в данном случае)! Поле должно быть опубликовано правильно, чтобы избежать условий гонки. – isnot2bad