线程化时是否多次分配java静态字段?

线程化时是否多次分配java静态字段?,java,multithreading,memory,static,Java,Multithreading,Memory,Static,我正在处理一个组项目,其中我们在一个工人类中声明了几个静态常量。这个worker产生了多个线程,我们的java应用程序似乎正在使用大量内存。我想知道这是否是每个线程分配更多这些静态常量的结果,但我不确定。不,每个类加载器只有一个静态变量实例 public class Foo { // only 1 of these private static int bar = 10; } 但是,重要的是要认识到,这并不意味着该值是自动同步的。如果线程正在更改此值,则需要对其进行

我正在处理一个组项目,其中我们在一个工人类中声明了几个静态常量。这个worker产生了多个线程,我们的java应用程序似乎正在使用大量内存。我想知道这是否是每个线程分配更多这些静态常量的结果,但我不确定。

不,每个类加载器只有一个静态变量实例

 public class Foo {
      // only 1 of these
      private static int bar = 10;
 }

但是,重要的是要认识到,这并不意味着该值是自动同步的。如果线程正在更改此值,则需要对其进行
同步
,否则它们可能会根据竞争条件看到不同的值。

静态变量不会根据线程的数量进行显式分配。相反,静态变量只在类加载器中分配一次。

如果您使用的是“巨大”内存量,例如许多GB,我会使用内存分析器来查找原因,并在可能的情况下进行修复。如果您使用的是几百MB,除非您知道这是一个问题,否则我不会担心它。

这些变量是最终的,所以我不担心。我想这暗示了一个不同的记忆问题。@DanQ不这么认为,但那是为了子孙后代。只是一个想法。热部署可能会出现问题,旧类实例会延迟。重新启动应用程序服务器时应该会显示这一点。@MikeBaranczak在编程中,“变量”通常指任何指定的数量,无论它是否变化。在cplusplus.com中,变量定义如下:。。。关于事物是否变化,几乎没有人说什么。从语义上讲,在英语中,它要么是变量,要么是常量,但在编程术语中,说“常量变量”并不是一个矛盾修饰法
 public class Foo {
      // only 1 of these
      private static int bar = 10;
 }