Java 每个线程是否可以有一个唯一的静态变量?
我有一个静态变量,我希望每个线程都是唯一的 所有静态变量都是这样吗?或者不能保证。也就是说,线程是否会偶尔更新主内存中静态变量的值,或者将其保存在自己的内存中Java 每个线程是否可以有一个唯一的静态变量?,java,multithreading,variables,static,Java,Multithreading,Variables,Static,我有一个静态变量,我希望每个线程都是唯一的 所有静态变量都是这样吗?或者不能保证。也就是说,线程是否会偶尔更新主内存中静态变量的值,或者将其保存在自己的内存中 如果不能保证这一点,Java中是否存在静态和线程唯一的变量类型?对于一个线程来说,某种本质上是全局的,但对其他线程来说是隐藏的?我认为您需要的是Java的 此类提供线程局部变量。这些变量不同于它们的普通对应变量,因为访问一个变量的每个线程(通过其get或set方法)都有自己的、独立初始化的变量副本。 请注意,如果您使用线程池,这可能会给
如果不能保证这一点,Java中是否存在静态和线程唯一的变量类型?对于一个线程来说,某种本质上是全局的,但对其他线程来说是隐藏的?我认为您需要的是Java的 此类提供线程局部变量。这些变量不同于它们的普通对应变量,因为访问一个变量的每个线程(通过其get或set方法)都有自己的、独立初始化的变量副本。 请注意,如果您使用线程池,这可能会给您带来问题,因为您可能会认为您正在获得一个新线程,即启动一个新进程,但实际情况是,您正在重用一个线程,该线程已完成对其他数据的处理,因此留下了一些遗留问题,当它们在野外出现时,很难进行调试
是关于使用ThreadLocal的教程。
静态变量在线程之间共享
如果希望每个线程的变量都是唯一的,则可能需要使用:
//包含要分配的下一个线程ID的原子整数
私有静态最终AtomicInteger nextId=新的AtomicInteger(0);
//包含每个线程ID的线程局部变量
私有静态最终ThreadLocal threadId=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回nextId.getAndIncrement();
}
};
这正是它的用途。虽然我很想知道这个静态变量中存储了什么,以及为什么您认为每个线程都需要一个唯一的变量。原子整数不是线程局部的。这允许您以线程安全的方式获取并增加它包含的值。是否保证在线程之间共享静态变量?对此问题的回答并不意味着:“t1对其本地缓存中的静态变量所做的更新不会反映在t2缓存的静态变量中”,其中t1和t2是threads@stuart我相信它一定会被共享,但不一定会持续更新,除非你声明它是volatile。本质上,一个线程可以缓存它一段时间,我确信它周围有保证。@ArtB你是说“不是”吗?还有一个遗漏的“not”在那里:“…我不确定?关于它的保证是肯定的。”@stuart是的,这就是我的意思。哇,这给我带来了很大的问题,因为线程池重用了旧任务中的旧线程,直到我明白发生了什么。
// 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();
}
};