【问题标题】:Is it possible to have a static variable unique per thread?每个线程是否可以有一个唯一的静态变量?
【发布时间】:2015-09-25 10:40:23
【问题描述】:

我有一个静态变量,我希望每个线程都是唯一的。

所有静态变量都是这种情况吗?或者不能保证。也就是说,线程会偶尔更新主存中静态变量的值,还是自己保留?

如果不能保证这一点,Java 中是否有任何类型的变量既是静态的又是线程唯一的?对线程来说本质上是全局的,但对其他线程隐藏的东西?

【问题讨论】:

  • 这正是ThreadLocal 的用途。虽然我很想知道您在这个静态变量中存储了什么以及为什么您认为每个线程都需要一个唯一的变量。

标签: java multithreading variables static


【解决方案1】:

我认为您正在寻找的是 Java 的 ThreadLocal

这个类提供线程局部变量。这些变量不同于它们的正常对应变量,因为每个访问一个(通过它的 get 或 set 方法)的线程都有它自己的、独立初始化的变量副本。

请注意,如果您使用线程池,这可能会给您带来问题,因为您可能认为您正在获得一个新线程,就它启动一个新进程而言,但正在发生的事情是您正在重用一个线程,该线程完成了对其他数据的处理,因此有剩余,当它们在野外发生时很难调试。

Here 是一个使用 ThreadLocal 的教程。

【讨论】:

  • 哇,这给我带来了很大的问题,因为线程池重用了旧任务中的旧线程,直到我明白发生了什么。
【解决方案2】:

static 变量在线程之间共享。

如果您希望每个线程的变量是唯一的,您可能需要使用ThreadLocal

 // Atomic integer containing the next thread ID to be assigned
 private static final AtomicInteger nextId = new AtomicInteger(0);

 // Thread local variable containing each thread's ID
 private static final ThreadLocal<Integer> threadId =
     new ThreadLocal<Integer>() {
         @Override protected Integer initialValue() {
             return nextId.getAndIncrement();
     }
 };

【讨论】:

  • 原子整数不是线程本地的。这使您可以线程安全地获取并增加它包含的值。
  • 是否保证静态变量将在线程之间共享?对这个问题的回答暗示不是:stackoverflow.com/questions/2423622/volatile-vs-static-in-java/…“t1 对其本地缓存中的静态变量进行的更新不会反映在 t2 缓存的静态变量中”其中 t1 和 t2 是线程
  • @stuart 我相信它可以保证共享不保证会持续更新,除非您声明它volatile。从本质上讲,允许一个线程缓存它一段时间,我确信它周围的保证。
  • @ArtB 你的意思是说“不是”吗?那里还有一个缺失的“不”:“......而且我没有?确定它周围的保证。”
  • @stuart 是的,我就是这个意思。
猜你喜欢
  • 2012-09-29
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2015-10-15
  • 2013-01-07
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多