我在遗留系统中遇到了以下代码,
private static final ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal(){
@Override
protected Object initialValue() {
//Set initial value
return new SimpleDateFormat("");
}
};
private static final DateFormat someValue = dateFormatThreadLocal.get();
但是,我有以下问题。
1。)将线程局部定义为final是一个好主意。 (我知道静电很好)
2。)在静态(或静态和最终)实例变量中保持线程local.get()是一个好主意吗? (如果我们这样做并不妨碍首先拥有线程本地的整个目的)
答案 0 :(得分:5)
1。)将线程局部定义为final是一个好主意。 (我知道静电很好)
如果您没有分配到dateFormatThreadLocal
,则final
没有任何区别。但是,这通常是一个好主意,因为它会阻止您意外地分配给它。
2。)在静态(或静态和最终)实例变量中保持线程local.get()是一个好主意吗? (如果我们这样做并不妨碍首先拥有线程本地的整个目的)
不,不是。实际上,如果你做这样做,那么它首先会破坏线程本地的整个目的。
无论哪个线程首先加载类,都将检索其SimpleDateFormat,并在someValue
中存储对该对象的引用。然后,无论何时使用someValue
,当前线程都将使用该线程的 SimpleDateFormat(之前得到的),而不是调用dateFormatThreadLocal.get()
并获得自己的线程。
如果您正在使用ThreadLocal,那么您可能 希望每个线程都使用相同的对象 - 否则为什么还要使用呢?