Java 在静态final字段中保存线程本地值是一种不好的做法吗?
我在遗留系统中遇到以下代码Java 在静态final字段中保存线程本地值是一种不好的做法吗?,java,multithreading,thread-local,Java,Multithreading,Thread Local,我在遗留系统中遇到以下代码 private static final ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal(){ @Override protected Object initialValue() { //Set initial value return new SimpleDateFormat(""); } }; private s
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();
private static final ThreadLocal dateFormatThreadLocal=new ThreadLocal(){
@凌驾
受保护对象初始值(){
//设定初始值
返回新的SimpleDataFormat(“”);
}
};
私有静态最终DateFormat someValue=dateFormatThreadLocal.get();
不过,我有以下问题
1.)将线程局部变量定义为final是一个好主意。(我知道静电很好)
2.)在静态(或静态和最终)实例变量中保留thread local.get()调用是一个好主意吗?(如果我们这样做的话,它是否妨碍了将线程放在本地的整个目的)
1.)将线程局部变量定义为final是一个好主意。(我知道静电很好)
如果您没有分配给dateFormatThreadLocal
,则final
没有区别。但是,这通常是一个好主意,因为它可以防止您意外地指定给它
2.)在静态(或静态和最终)实例变量中保留thread local.get()调用是一个好主意吗?(如果我们这样做的话,它是否妨碍了将线程放在本地的整个目的)
不,不是。实际上,如果您这样做,那么首先就无法实现线程本地化的全部目的
无论哪个线程首先加载该类,都将检索其SimpleDataFormat,并将对该对象的引用存储在someValue
中。然后,无论何时使用someValue
,当前线程都将使用该线程的SimpleDataFormat(它以前使用过),而不是调用dateFormatThreadLocal.get()
,并获取自己的SimpleDataFormat
如果您使用的是ThreadLocal,那么您可能不希望每个线程都使用同一个对象,否则为什么还要麻烦使用它呢?FYI如果您有java 8,您可以使用线程安全的
DateTimeFormatter
: