Java Scala动态变量';s螺纹局部更换
我不理解Java Scala动态变量';s螺纹局部更换,java,scala,thread-local,Java,Scala,Thread Local,我不理解DynamicVariable背后的代码和逻辑: 首先,使用默认值创建一个DynamicVariable实例。。。默认值???您需要每个线程的值!这是否意味着在所有线程之间共享相同的默认值?违背了目的。。。还是 然后在所有示例中,我看到带值的几乎每次都像是创建一个新实例,或者 e、 g.ThreadLocal带有一个经典案例,该案例有意义SimpleDateFormat,每次创建它都非常昂贵,而且不是线程安全的: import java.text.SimpleDateFormat;
DynamicVariable
背后的代码和逻辑:
- 首先,使用默认值创建一个
实例。。。默认值???您需要每个线程的值!这是否意味着在所有线程之间共享相同的默认值?违背了目的。。。还是DynamicVariable
- 然后在所有示例中,我看到带值的
几乎每次都像是创建一个新实例,或者
ThreadLocal
带有一个经典案例,该案例有意义SimpleDateFormat
,每次创建它都非常昂贵,而且不是线程安全的:
import java.text.SimpleDateFormat;
static ThreadLocal<SimpleDateFormat> dateFormatTl = new ThreadLocal<SimpleDateFormat>();
...
// many threads execute this, check if there already exists a
// Thread-bound instance otherwise create a new one per-thread
if (dateFormatTl.get() == null) {
dateFormatTl.set(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss"));
}
// safely use the Thread-bound instance
SimpleDateFormat dateFormat = dateFormatTl.get();
dateFormat.format(new Date(java.util.Date.getTime()));
您想做的事情可以这样做:
Future {
dateFormatDv.withValue(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) {
doStuffWithDateFormat(dateFormatDv.value)
doMoreStuffWithTheSameFormatInstance(dateFormatDv.value)
}
}
Future {
dateFormatDv.withValue(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) {
useADifferentInstanceOfDateFormat(dateFormat.value)
}
}
至于默认值,它只允许您设置它,以便您可以在当前线程中方便地使用它,而无需。withValue
doSomethingWithDefaultFormatInstance(dateFormat.value)
Scala的
DynamicVariable
的ThreadLocal
标准化更像这样,我想:
// do only once and put in static scope within some Object
val dateFormatDv = new DynamicVariable[Option[SimpleDateFormat]](None)
// this is executed by different threads
def formatTimestamp(timestamp: Long): String = {
dateFormatDv.value match {
case None => dateFormatDv.value_=(Some(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")))
}
// safely use the Thread-bound instance
dateFormatDv.value.map(_.format(new Date(timestamp))).get
}
是的,它与
相同。带value
,只是不太地道。您也可以只使用ThreadLocal
。您的意思是,如果同一个线程多次执行行dateformatv.withValue
,则第一次只创建SimpleDataFormat
的一个实例,并在每次后续执行中重复使用?不,我的意思是,您执行。withValue
一次,然后该块中的所有内容都会看到该值。但这就是关键所在,您有许多传入线程执行。withValue
及以上版本,而ThreadLocal
的关键是每个线程都有一个可重用的单独实例,而不是每次都创建一个新实例。因此,您编写的代码与我编写的代码不是100%相同。是的,许多线程正在执行。withValue(new Foo){…}
,并且每个线程在{}
中都有自己的实例Foo
。那正是你所说的好吧。。。我需要测试它以确定:)但我现在接受。。。
// do only once and put in static scope within some Object
val dateFormatDv = new DynamicVariable[Option[SimpleDateFormat]](None)
// this is executed by different threads
def formatTimestamp(timestamp: Long): String = {
dateFormatDv.value match {
case None => dateFormatDv.value_=(Some(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")))
}
// safely use the Thread-bound instance
dateFormatDv.value.map(_.format(new Date(timestamp))).get
}