java中的静态变量和多线程

sha*_*awn 22 java static multithreading

是一个类的静态成员,每个进程或线程只显示一个实例?含义是否每个线程都有自己的类的静态成员变量的副本?

我的猜测是按程序进行的,我是否正确?

Gra*_*ray 41

static 字段每个类加载器有一个值,但我认为你的问题的主要内容如下:

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

虽然魔鬼在细节中,但这是正确的.每个线程可以在其自己的本地存储器空间/高速缓存中具有它自己的字段副本,除非该字段已被标记为volatile强制该字段被存储器屏障包围,这导致每次访问/更新时的存储器同步.

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

这是关于Java内存模型的一个不错的页面,以及对一些挑战的良好概述.

  • 实际上,每个*处理器****可以***拥有它自己的副本.虽然"虚拟处理器"等人进一步混淆了水. (2认同)

SLa*_*aks 24

静态字段为每个类加载器提供一个值.

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

  • 是的,对于凡人来说,"每个类加载器"意味着"每个JVM进程".从技术上讲,由两个不同的类加载器加载的相同类导致两个不同的类,即使它们具有相同的名称并且可能已从完全相同的类文件加载. (8认同)

Tom*_*icz 11

static每个类加载器有一个加载此类的变量副本.这或多或少意味着每个进程,但您需要了解其中的差异.

例如,当两个web-app捆绑相同的类时,该类将被加载两次,因此具有相同static字段的两个副本.

如果您需要一个基于线程的独立值的变量,请查看ThreadLocal.