Java 中的静态变量和多线程

2022-09-01 17:58:32

类的静态成员是否仅作为每个进程或线程的单个实例存在?这意味着每个线程都有自己的类的静态成员变量的副本吗?

我的猜测是每个进程,我是对的吗?


答案 1

类的静态成员是否仅作为每个进程或线程的单个实例存在?

static字段每个类加载器都有一个值,但我认为您的问题的重点在于以下内容:

每个线程都有自己的类的静态成员变量的副本

这是正确的,尽管魔鬼在细节中。每个线程都可以在其自己的本地内存空间/缓存中拥有自己的字段副本,除非该字段已标记,强制字段被内存屏障包围,从而导致每次访问/更新时的内存同步。volatile

如果没有 ,对字段的任何更新和读取都将对本地线程存储进行,并且只有在线程越过内存障碍时才更新。如果没有内存屏障,就无法保证数据操作的顺序以及何时与其他线程共享更新。volatilestatic

这里有一个关于Java内存模型的不错的页面,并很好地概述了一些挑战


答案 2

静态字段为每个类装入器提供了一个值。

如果需要每线程值,请创建静态 ThreadLocal<T>


推荐