0

我可以ConcurrentHashMap<Thread, object>存储线程的数据并用于Thread.currentThread()检索它吗?我检查了 Java 源代码,发现它currentThread()是原生的并且equals没有被覆盖。

4

3 回答 3

4

你可以,但是有一个内置机制ThreadLocal就是为了这个目的。重新发明它的唯一原因是,如果您还需要从它们的“所有者”以外的某个线程访问这些值以操纵它们。

  ThreadLocal<Object> data = new ThreadLocal<Object>();

  public Object getData() {
      return this.data.get();
  }

  public void setData(Object data) {
      this.data.set(data);
  }

请注意,每个线程的初始值为 null,但您可以提供默认值:

  ThreadLocal<Object> data = new ThreadLocal<Object>() {
      protected Object initialValue() { return "foo"; }
  };
于 2012-07-23T22:49:46.723 回答
1

是的,你总是会得到相同的Thread对象,所以你可以这样做。

但是,与其自己制作这样的表,不如考虑使用该ThreadLocal功能,它本质上是做同样的事情,但具有特定的初始化语义。

于 2012-07-23T22:49:41.570 回答
1

您可以,但这种方法的问题是您正在创建对线程的硬引用,这意味着即使线程终止,它引用的对象也不会被 GC 收集。

于 2012-07-23T22:52:14.053 回答