Java中的线程本地变量和本地变量

时间:2015-03-01 18:40:01

标签: java multithreading

我们不能使用线程安全的局部变量而不是ThreadLocal。 以及使用ThreadLocal的地方。请引用一些真实的应用示例。

4 个答案:

答案 0 :(得分:4)

一个典型的例子是SimpleDateFormat,它不是线程安全的。在多线程上下文中,有两个线程安全选项:

private static ThreadLocal<SimpleDateFormat> fmtHolder = new ThreadLocal<SimpleDateFormat>() {
  @Override protected SimpleDateFormat initialValue() {
    return new SimpleDateFormat("dd/MM/yyyy");
  }
};

private void method() {
  SimpleDateFormat fmt = fmtHolder.get();
}

或使用本地实例:

private void method() {
  SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
}

前者可以更有效率,而后者更容易阅读和推理。

答案 1 :(得分:1)

局部变量只能在声明它的函数或块中使用,并且当函数返回或块退出时它不再存在。

当您需要静态数据时,您使用ThreadLocal对象(通常从static变量或单个对象的实例变量引用),但您希望每个线程都有自己的副本。

答案 2 :(得分:0)

线程局部变量在不同的线程中有不同的实例。这允许每个线程拥有它自己的变量视图,该视图独立于其他线程看到的。 “Plain”局部变量是一个单独的实例,当以线程安全的方式访问时,它将在所有线程中具有相同的值。

答案 3 :(得分:-1)

ThreadLocal是线程的本地。局部变量是堆栈的局部变量(假设你的意思是“局部”,就像在方法中声明的变量一样)。