在静态最终字段中保存线程局部值是不好的做法?

时间:2017-02-16 00:59:16

标签: java multithreading thread-local

我在遗留系统中遇到了以下代码,

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()是一个好主意吗? (如果我们这样做并不妨碍首先拥有线程本地的整个目的)

1 个答案:

答案 0 :(得分:5)

  

1。)将线程局部定义为final是一个好主意。 (我知道静电很好)

如果您没有分配到dateFormatThreadLocal,则final没有任何区别。但是,这通常是一个好主意,因为它会阻止您意外地分配给它。

  

2。)在静态(或静态和最终)实例变量中保持线程local.get()是一个好主意吗? (如果我们这样做并不妨碍首先拥有线程本地的整个目的)

不,不是。实际上,如果你这样做,那么它首先会破坏线程本地的整个目的。

无论哪个线程首先加载类,都将检索其SimpleDateFormat,并在someValue中存储对该对象的引用。然后,无论何时使用someValue,当前线程都将使用该线程的 SimpleDateFormat(之前得到的),而不是调用dateFormatThreadLocal.get()并获得自己的线程。

如果您正在使用ThreadLocal,那么您可能 希望每个线程都使用相同的对象 - 否则为什么还要使用呢?