Я использую объект, который служит примерно как обертка для карты строк:
public class Wrapper {
private Map<String, String> values;
private Formatter formatter;
public BigDecimal getSpecialValue() {
String result = values.get("Special");
return formatter.formatNumber(result);
}
}
Вышеупомянутый форматер служит примерно как средство отображения для SimpleDateFormat
public class Formatter {
private static final NumberFormat NUMBER_FORMAT;
public BigDecimal formatNumber(String s) {
Number num = NUMBER_FORMAT.parse(s);
if (num instanceof Integer) {
return new BigDecimal((Integer) num);
} else if (num instanceof Double) {
return new BigDecimal((Double) num);
} ...
}
}
Когда я обращаюсь к методу getSpecialValue()
сразу несколькими потоками, возникает некоторое поведение, которое может быть объяснено только одновременным доступом, например, может быть NumberFormatException
или ParseException
, где анализируемая строка равна .430.430вместо .430 и т. д.
Меня интересуют два аспекта: 1.) Оболочка доступна только для чтения.Хотя доступ к коллекции не синхронизирован, у меня сложилось впечатление, что это всегда должно работать.2.) В одной из первых попыток найти проблему я изменил конструктор класса Wrapper
, чтобы он выполнял метод formatNumber
(очевидно, однопоточный), что исключало все исключения во время выполнения.
Кто-нибудь может объяснить?
Редактировать: Карта в классе Wrapper
заполнена конструктором, что наиболее определенно происходит однопоточным.После этого оболочка создается так, что карта является неизменной.