而不是编写以下非线程安全方法。
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
?
答案 0 :(得分:5)
如果您的唯一目的是使其线程安全,那么确实没有必要这样做。但是当线程由线程池维护并且你的意图更多是从线程池中给每个刚刚发布的线程提供它自己的初始值时,你应该这样做。
答案 1 :(得分:2)
正如@BalusC所说,这取决于你所关注的事情。
我怀疑使用本地线程回收Calendar
个对象实际上可能比不通过调用Calendar.getInstance()
而节省的成本更高。这有一种过早的微观优化的气味。