DecimalFormat.format (double) в разных темах - PullRequest
26 голосов
/ 08 декабря 2010

Мне нужно распечатать много отформатированных десятичных значений во многих потоках параллельно.Для форматирования десятичных значений я использую java.text.DecimalFormat, настроенный по шаблону.Мне известно о предупреждении из документа java DecimalFormat:

Десятичные форматы, как правило, не синхронизируются.Рекомендуется создавать отдельные экземпляры формата для каждого потока.Если несколько потоков обращаются к формату одновременно, он должен быть синхронизирован извне.

Но я не знаю, относится ли это предупреждение к моему сценарию: я настраиваю java.text.DecimalFormat один раз при запуске приложения (исохраните Formatter в последнем поле).После этого я использую ТОЛЬКО метод format(double).

Причина, по которой я хочу это сделать: я не хочу терять производительность, создавая новый экземпляр DecimalFormat каждый раз, когда мне нужно напечататьотформатированный номер.

Я посмотрел код DecimalFormat.format(double), и он выглядит как поточно-ориентированный, но я не уверен.

Не могли бы вы подтвердить, что использование DecimalFormat.format(double) в конечном итоге потокобезопасен, когда не изменяется конфигурация форматера, или объясните, почему это не так?

Ответы [ 3 ]

25 голосов
/ 28 июня 2016

Просто используйте этот потокобезопасный фрагмент для NumberFormat:

static ThreadLocal<NumberFormat> numberFormat = new ThreadLocal<NumberFormat>() {
    @Override
    public NumberFormat initialValue() {
        return new DecimalFormat("00000");
    }
};

Или в Java 8, как сказал Джеспер в комментарии:

private static ThreadLocal<NumberFormat> numberFormatter = 
                  ThreadLocal.withInitial(() -> new DecimalFormat("00000"));
21 голосов
/ 08 декабря 2010

Хотя текущая реализация может в конечном итоге быть поточно-ориентированной, такой гарантии для будущих реализаций или для других JRE нет.

Вы убедились, что отказ от new DecimalFormat() является измеримым увеличением производительности в вашем приложении?

6 голосов
/ 08 декабря 2010

Текущая реализация Hotspot для DecimalFormat делает вызов DecimalFormat.format (double) поточно-ориентированным, если вы не вызываете другие методы в этом экземпляре. Однако настоятельно рекомендуется не полагаться на это (возможно) временное поведение.

Рассматривали ли вы использование переменной ThreadLocal, чтобы избежать слишком большого числа new DecimalFormat()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...