sha*_*awn 22 java static multithreading
是一个类的静态成员,每个进程或线程只显示一个实例?含义是否每个线程都有自己的类的静态成员变量的副本?
我的猜测是按程序进行的,我是否正确?
Gra*_*ray 41
static 字段每个类加载器有一个值,但我认为你的问题的主要内容如下:
每个线程都有自己的类的静态成员变量的副本
虽然魔鬼在细节中,但这是正确的.每个线程可以在其自己的本地存储器空间/高速缓存中具有它自己的字段副本,除非该字段已被标记为volatile强制该字段被存储器屏障包围,这导致每次访问/更新时的存储器同步.
如果没有volatile,则对static字段的任何更新和读取都将对本地线程存储进行,并且只有在线程穿过内存屏障时才会更新.如果没有内存障碍,则无法保证数据操作的顺序以及何时与其他线程共享更新.
这是关于Java内存模型的一个不错的页面,以及对一些挑战的良好概述.
SLa*_*aks 24
静态字段为每个类加载器提供一个值.
如果您需要每线程值,请创建一个静态值ThreadLocal<T>.
Tom*_*icz 11
static每个类加载器有一个加载此类的变量副本.这或多或少意味着每个进程,但您需要了解其中的差异.
例如,当两个web-app捆绑相同的类时,该类将被加载两次,因此具有相同static字段的两个副本.
如果您需要一个基于线程的独立值的变量,请查看ThreadLocal.