Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala动态变量';s螺纹局部更换_Java_Scala_Thread Local - Fatal编程技术网

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
    实例。。。默认值???您需要每个线程的值!这是否意味着在所有线程之间共享相同的默认值?违背了目的。。。还是
  • 然后在所有示例中,我看到带值的
    几乎每次都像是创建一个新实例,或者
e、 g.
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
}