【问题标题】:In Java, how can I implement my own ThreadLocal from scratch? [duplicate]在 Java 中,如何从头开始实现自己的 ThreadLocal? [复制]
【发布时间】:2012-12-25 21:54:47
【问题描述】:

可能重复:
How is Java’s ThreadLocal implemented under the hood?

我已经有一段时间没有使用 Java 编程了,我想重新了解一些理论。

如何从头开始实现我自己的 ThreadLocal?

【问题讨论】:

  • 有什么比right at the source更好的起点。
  • 原来问题是重复的。不知道为什么上一个问题有 11 个赞成票时反对票。
  • @Peter - 好点。不过,我认为这个问题很有趣,如果它出现在公共领域中,可能对其他人有用。
  • 我同意,对于那些对在代码中实现细节不感兴趣但想了解它是如何工作的人来说,在博客中回答这个问题是一个有趣的问题。您可以查看子类 ThreadLocal 的用途以及它可能存在的问题。您还可以查看 InheritableThreadLocal。 ;)

标签: java


【解决方案1】:

是的。您可以对线程进行子类化并在 Thread 的源代码中复制实现。或者您可以只阅读代码,但要正确获取 ThreadLocal 是很棘手的。

有很多棘手的元素,最明显的是防止未删除的线程导致内存泄漏。

即使是现有的实现也存在子类化 ThreadLocal 对象会阻止 ClassLoader 卸载的问题。

【讨论】:

  • 很想接受,但什么是简单的解释,又是什么让它变得棘手。 . (原来问题是重复的)。
  • 很棘手,即使是现有的实现也不是万无一失的。
【解决方案2】:

试试这个:

new Thread()
{
    //contents
}.start();

您可以在代码中的任何位置生成它。

【讨论】:

  • 这个问题与生成线程无关。它与 ThreadLocal 相关——这是一个在运行线程的上下文中存储信息的类,然后从一些不相关的类中检索它。 . .内部实现挺简单的,具体细节忘记了,所以问了。
  • 谢谢,我没用过ThreadLocal,觉得这样可以解决你的问题。
  • 没有问题,感谢您的尝试。
【解决方案3】:

原来这个问题是重复的:

这很简单,真的,它只是存储在每个 Thread 对象中的名称-值对的映射(参见 Thread.threadLocals 字段)。 API 隐藏了实现细节,但这或多或少是它的全部。

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2019-12-17
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2017-09-23
    • 2011-01-20
    相关资源
    最近更新 更多