java - 线程本地实现

标签 java multithreading thread-local

引用我之前的question ,更进一步,

  1. 与局部变量相比,使用 ThreadLocal 有何缺点
  2. 它们是如何实现的
  3. session 变量是ThreadLocals
  4. 是否有更多经常使用的 ThreadLocal 示例

最佳答案

我不确定我是否会称其为缺点,但必须非常小心地正确清理 ThreadLocals,因为只要线程存在,您放入其中的任何数据都会保留在那里,除非它被显式删除。在使用线程池重用线程的环境中,这尤其麻烦,因此一些垃圾数据可能会附加到线程,除非正确清理。

ThreadLocals 实际上被广泛使用 - 主要由框架开发人员使用,因为它们允许将“上下文”附加到用户方法而不更改方法签名。例如,J2EE 中的事务管理是通过 ThreadLocals 完成的 - 对当前打开事务的引用始终附加到线程,以便当您使用数据库时,您将使用当前打开的事务自动访问它。如果没有 ThreadLocal,您将需要将这些引用作为方法参数传递。

还有许多此类用法的其他示例。我不确定您指的是什么 session 变量,但类似 session 的数据通常附加到 ThreadLocal。

关于实现 - 我真的不确定。我想我在某处读到它是在 JVM 中以相当低的级别实现的,以使性能非常快,因为今天有相当多的代码使用它。

关于java - 线程本地实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492036/

相关文章:

java - 如何更改绘制 GUI 中线条的颜色

java - 如何使用命令行查看javadoc

java - Firebase 无法使用类检索数据

C# AppendText 从另一个线程不工作的 TextBox

java - resultset.getTimestamp 和 ThreadLocal 警告 Java

java - Thread Local - 我做错了什么?

java - 线程局部变量为空

java - 如何将 Joda DateTime(UTC) 转换为 java.sql.Timestamp(UTC)?

java - 为 ConcurrentHashMap 初始化值的最快方法

java - Android AsyncTask.THREAD_POOL_EXECUTOR 与自定义 ThreadPool 与 Runnables