Нужно ли вызывать ThreadLocal.remove в следующем случае - PullRequest
4 голосов
/ 22 августа 2010

Вместо написания следующего не поточно-безопасного метода.

private static final Calendar calendar = Calendar.getInstance();
public void fun() {
    // Going to call mutable methods in calendar.
}

Я изменяю это на потокобезопасную версию.

public void fun() {
    final Calendar calendar = Calendar.getInstance();
    // Going to call mutable methods in calendar.
}

Вместо того, чтобы каждый раз создавать новый экземпляр даже для одного и того же потока, я сделал улучшение на

public void fun() {
    final Calendar calendar = getCalendar();
    // Going to call mutable methods in calendar.
}

/**
 * Returns thread safe calendar.
 * @return thread safe calendar
 */
public Calendar getCalendar() {
    return calendar.get();
}

private static final ThreadLocal <Calendar> calendar = new ThreadLocal <Calendar>() {
    @Override protected Calendar initialValue() {
        return Calendar.getInstance();
     }
 };

Для моего 3-го подхода есть ли необходимость вызывать ThreadLocal.remove?

Ответы [ 2 ]

5 голосов
/ 22 августа 2010

Если ваше единственное намерение - сделать его поточно-безопасным , то в этом действительно нет необходимости. Но когда потоки поддерживаются пулом потоков, а ваша цель состоит в том, чтобы дать каждому недавно освобожденному потоку из пула потоков собственное начальное значение, тогда вам следует это сделать.

2 голосов
/ 22 августа 2010

Как говорит @BalusC, это зависит от того, что вас беспокоит.

У меня есть подозрение, что ваша переработка Calendar объектов с использованием локального потока может стоить больше, чем вы экономите, незвонит Calendar.getInstance().Это имеет запах преждевременной микрооптимизации.

...