Tag: thread local storage

在实例变量中使用ThreadLocal

如果Java ThreadLocal变量用作实例变量 (例如,在生成线程局部对象的方法中), 那么它们是否会生成线程局部值 ,或者它们是否必须始终是静态的? 作为一个例子,假设一个典型的场景,其中几个非常昂贵的初始化非线程安全的类的对象需要在单个静态初始化块中实例化,存储在单个类的静态变量中(例如,在Map数据结构)从那时起用于许多不同线程的密集处理。 为了实现线程安全,显然必须传递每个静态对象的不同副本。 例如,需要跨不同线程安全使用的Java DateFormat对象。 在Web上可以找到的许多示例中,方法似乎是分别声明每个ThreadLocal变量,在initialValue()方法中实例化新对象,然后使用get()方法来检索线程本地实例。 如果要创建数十个或数百个这样的对象,每个都有自己的初始化参数,这种方法效率不高。 例如,许多SimpleDateFormat对象各有不同的日期模式。 如果对象的实例化可以在循环中完成,该循环在每次迭代中产生不同的值,则在通过适当地初始化相应对象来创建每个值之后,将需要用于产生线程局部实例的通用方法。 基于以上所述,以下通用静态方法不起作用,因为每次调用initialValue()时都会产生相同的引用: // Each value is an object initialized prior to calling getLocal(…) public static final T getLocal(final T value) { ThreadLocal local = new ThreadLocal() { @Override protected T initialValue() { return value; } }; return local.get(); } 相反,需要一种在initialValue()中创建新对象的机制。 因此,唯一的通用方法可能是使用reflection,类似于 private static […]