我们不能使用线程安全的局部变量而不是ThreadLocal。 以及使用ThreadLocal的地方。请引用一些真实的应用示例。
答案 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
是线程的本地。局部变量是堆栈的局部变量(假设你的意思是“局部”,就像在方法中声明的变量一样)。