Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个线程是否可以有一个唯一的静态变量?_Java_Multithreading_Variables_Static - Fatal编程技术网

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