每个线程是否可以拥有一个唯一的静态变量?

4

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

所有的静态变量都是这样吗?还是不能保证?也就是说,是否会有线程偶尔更新静态变量的值到主内存中,或将其保留在自己的线程中?

如果无法保证,是否有任何类型的Java变量既是静态的又是线程独有的?某些东西对于一个线程来说是全局的,但对其他线程隐藏?


3
这正是 ThreadLocal 所用的地方。虽然我很想知道您在这个静态变量中存储了什么以及为什么您认为需要为每个线程创建一个唯一的变量。 - Sean Bright
2个回答

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

该类提供了线程本地变量。这些变量与其普通副本不同,因为每个访问它们(通过其get或set方法)的线程都有自己独立初始化的变量副本。

请注意,如果您使用线程池,这可能会给您带来问题,因为您可能会认为您得到了一个新线程,就像启动一个新进程一样,但实际上您正在重用已完成其他数据工作的线程,并留下了残留物,当这些情况发生时很难调试。

这里有一个关于如何使用ThreadLocal的教程。


哇,那给我带来了很大的问题,因为线程池重用了旧任务的旧线程,直到我明白发生了什么。 - CMS

5

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();
     }
 };

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - LhasaDad
一个静态变量是否保证在多线程之间共享?对这个问题的回答暗示着不会:https://dev59.com/mnE95IYBdhLWcg3wKq2q#12193970 "t1 对静态变量在其本地缓存中所做的更新不会反映在 t2 缓存的静态变量中",其中 t1 和 t2 是线程。 - stuart
1
@stuart 我相信它保证是共享的,但是如果你不声明为 volatile,它不保证被持续更新。基本上,一个线程可以缓存它一段时间,我对它的保证并不确定。 - Sled
1
@ArtB 你是不是想说“不是”?还有这里是否缺少了一个“不”:“...而且我不确定它的保证。” - stuart
1
@stuart 是的,那就是我想说的。 - Sled
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接