【问题标题】:Multiple objects in a ThreadLocalThreadLocal 中的多个对象
【发布时间】:2013-01-09 17:16:54
【问题描述】:

我们可以在ThreadLocal 中设置多个对象吗?

【问题讨论】:

  • 不在同一个线程上,你不能:-)
  • 您能举例说明您正在尝试做什么以及遇到了什么问题吗?
  • 仅用于学术目的。我想知道我们是否可以在 ThreadLocal 中设置多个对象,以便我们以后可以检索它。我不想为此目的使用地图!
  • 在Javadoc中可以看到set()只设置一个对象,get()只获取一个对象。

标签: java multithreading thread-local


【解决方案1】:

线程本地是当前线程的局部变量;所以每个线程都得到一个值。但是该值可以是一个实例,因此您可以在其中放置一个地图,例如,或者一个收集您想要的所有值的自定义类型。

【讨论】:

  • 请务必记住,在 ThreadLocal 中使用任何类型的 Collection 都可能加剧与 ThreadLocals 相关的内存泄漏/使用
【解决方案2】:

您可以拥有多个ThreadLocal,并且您可以在其中拥有一个包含多个对象的对象。

例如

final ThreadLocal<Map<String, String>> localProperties = new ThreadLocal<Map<String, String>>() {
     public Map<String, String> initialValue() {
           return new LinkedHashMap<String, String>();
     }
});

【讨论】:

  • 使用这种方法,请务必记住,在 ThreadLocal 中使用任何类型的 Collection 都可能加剧与 ThreadLocals 相关的内存泄漏/使用
  • 嗨@Peter 这是否意味着在这种情况下多个线程将具有相同的 threadLocal 实例(因为它是静态的)。
  • @Tarun 是的,ThreadLocal 是每个线程的 Map 的键。当您调用 get() 时,它会查找 Thread.currentThread() 的映射以获取该线程的参考
【解决方案3】:

我们可以在单个 Thread 中创建多个 ThreadLocal 对象,并使用特定 ThreadLocal 对象的 get() 方法访问它。

其实ThreadLocal有一个静态内部类ThreadLocalMap和一个自定义的hashmap,这个自定义映射中的key是ThreadLocal对象,value是要存储的值。

每个线程都持有这个threadLocalMap对象的引用。

【讨论】:

  • 链接中提供的示例不是threadlocal的正确用法
猜你喜欢
  • 2016-09-18
  • 2016-05-01
  • 1970-01-01
  • 2011-09-13
  • 2017-04-25
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多