Мне нужно вызвать ThreadLocal.remove в следующем случае

Вместо того, чтобы записывать следующий безопасный метод, отличный от потока.

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();
 }
 };
</calendar></calendar>

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

2 ответа

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


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

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

licensed under cc by-sa 3.0 with attribution.