当Thread正常处理变量并将其保留在本地缓存中时,ThreadLocal的用途是什么?
这意味着即使没有使用ThreadLocal,thread1也不知道thread2中相同var的值。
答案 0 :(得分:6)
使用多线程,虽然你必须做的工作,以确保你阅读"最近的"变量的值,你希望每个实例有效地存在一个变量(假设我们在这里讨论实例字段)。你可能会读到一个过时的值,除非你小心,但基本上你有一个变量。
使用ThreadLocal
,您明确希望每个读取变量的线程都有一个值。这通常是出于上下文的考虑。例如,具有一些身份验证层的Web服务器可能会在请求处理的早期设置线程局部变量,以便执行该请求时的任何代码都可以访问身份验证详细信息,而无需任何显式引用上下文对象。只要所有处理都在一个线程上完成,并且那个线程只执行 ,那你就没事了。
答案 1 :(得分:3)
线程没有 将变量保存在本地缓存中 - 只是它是允许的,除非你另有说明。
所以:
synchronized
块,volatile
变量等)。ThreadLocal
(假设多个线程知道保存变量的对象 - 如果它不是,那么一切都是线程本地的!)。答案 2 :(得分:1)
它是线程本身的一种全局变量,因此线程中运行的任何代码都可以直接访问它。 (A"真正"全局变量可以通过"进程中运行的任何代码访问&#34 ;;我们可以将其称为ProcessLocal:)
全局变量是不是很糟糕?也许;如果可以的话应该避免。但有时我们别无选择,我们无法通过方法参数传递对象,并且ThreadLocal证明在许多设计中都很有用而不会造成太多麻烦。
答案 3 :(得分:0)
使用ThreadLocal
是指对象不是线程安全的,但您希望避免同步访问。因此每个线程都将数据存储在自己的Thread本地存储内存中。默认情况下,数据在线程之间共享。