ThreadLocal有什么用?

时间:2015-05-12 17:37:45

标签: java multithreading

当Thread正常处理变量并将其保留在本地缓存中时,ThreadLocal的用途是什么?

这意味着即使没有使用ThreadLocal,thread1也不知道thread2中相同var的值。

4 个答案:

答案 0 :(得分:6)

使用多线程,虽然你必须做的工作,以确保你阅读"最近的"变量的值,你希望每个实例有效地存在一个变量(假设我们在这里讨论实例字段)。你可能会读到一个过时的值,除非你小心,但基本上你有一个变量。

使用ThreadLocal,您明确希望每个读取变量的线程都有一个值。这通常是出于上下文的考虑。例如,具有一些身份验证层的Web服务器可能会在请求处理的早期设置线程局部变量,以便执行该请求时的任何代码都可以访问身份验证详细信息,而无需任何显式引用上下文对象。只要所有处理都在一个线程上完成,并且那个线程只执行 ,那你就没事了。

答案 1 :(得分:3)

线程没有 将变量保存在本地缓存中 - 只是它是允许的,除非你另有说明。

所以:

  • 如果您想强制线程与其他线程共享其状态,则必须使用某种类型的同步(包括synchronized块,volatile变量等)。
  • 如果你想阻止线程与其他线程共享其状态,你必须使用ThreadLocal(假设多个线程知道保存变量的对象 - 如果它不是,那么一切都是线程本地的!)。

答案 2 :(得分:1)

它是线程本身的一种全局变量,因此线程中运行的任何代码都可以直接访问它。 (A"真正"全局变量可以通过"进程中运行的任何代码访问&#34 ;;我们可以将其称为ProcessLocal:)

全局变量是不是很糟糕?也许;如果可以的话应该避免。但有时我们别无选择,我们无法通过方法参数传递对象,并且ThreadLocal证明在许多设计中都很有用而不会造成太多麻烦。

答案 3 :(得分:0)

使用ThreadLocal是指对象不是线程安全的,但您希望避免同步访问。因此每个线程都将数据存储在自己的Thread本地存储内存中。默认情况下,数据在线程之间共享。

相关问题