4

而不是编写以下非线程安全的方法。

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

对于我的第三种方法,是否需要调用ThreadLocal.remove

4

2 回答 2

5

如果您唯一的目的是使其成为线程安全的,那么确实没有必要这样做。但是,当线程由线程池维护并且您的意图更多是为线程池中每个新释放的线程赋予其自己的初始值时,您应该这样做。

于 2010-08-22T06:12:45.697 回答
2

正如@BalusC 所说,这取决于您关心的内容。

我怀疑您Calendar使用本地线程回收对象的成本实际上可能比您通过不调用Calendar.getInstance(). 这有一种过早的微优化的味道。

于 2010-08-22T07:24:26.580 回答