我有一个静态变量,希望每个线程都是唯一的。
所有的静态变量都是这样吗?还是不能保证?也就是说,是否会有线程偶尔更新静态变量的值到主内存中,或将其保留在自己的线程中?
如果无法保证,是否有任何类型的Java变量既是静态的又是线程独有的?某些东西对于一个线程来说是全局的,但对其他线程隐藏?
我有一个静态变量,希望每个线程都是唯一的。
所有的静态变量都是这样吗?还是不能保证?也就是说,是否会有线程偶尔更新静态变量的值到主内存中,或将其保留在自己的线程中?
如果无法保证,是否有任何类型的Java变量既是静态的又是线程独有的?某些东西对于一个线程来说是全局的,但对其他线程隐藏?
请注意,如果您使用线程池,这可能会给您带来问题,因为您可能会认为您得到了一个新线程,就像启动一个新进程一样,但实际上您正在重用已完成其他数据工作的线程,并留下了残留物,当这些情况发生时很难调试。该类提供了线程本地变量。这些变量与其普通副本不同,因为每个访问它们(通过其get或set方法)的线程都有自己独立初始化的变量副本。
这里有一个关于如何使用ThreadLocal的教程。
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();
}
};
volatile
,它不保证被持续更新。基本上,一个线程可以缓存它一段时间,我对它的保证并不确定。 - Sled
ThreadLocal
所用的地方。虽然我很想知道您在这个静态变量中存储了什么以及为什么您认为需要为每个线程创建一个唯一的变量。 - Sean Bright