在下列情况下我是否需要调用ThreadLocal.remove

Che*_*eng 4 java concurrency thread-local

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

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

我将其更改为线程安全版本.

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

即使对于同一个线程,我也不是每次创建一个新实例,而是通过执行改进

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();
     }
 };
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 5

如果您的唯一目的是使其线程安全,那么确实没有必要这样做.但是当线程由线程池维护并且你的意图更多是从线程池中给每个刚刚发布的线程提供它自己的初始值时,你应该这样做.