繁体   English   中英

Java中的线程局部变量与局部变量

[英]Thread Local vs Local Variable in Java

我们不能使用线程安全的局部变量而不是ThreadLocal。 以及正在使用ThreadLocal的位置。 请引用一些实际的应用示例。

一个典型的示例是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");
}

前者可能更有效,而后者则更易于阅读和推理。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM