[英]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.