Java 静态变量是否只为所有正在运行的线程占用一个内存位置?

Java 静态变量是否只为所有正在运行的线程占用一个内存位置?,java,multithreading,static,variables,Java,Multithreading,Static,Variables,假设一个类的静态变量只占用一个内存位置,它是否由进程的所有线程共享?或者,是否为每个正在运行的线程创建了这样一个变量的一个内存位置 另外,如果所有线程共享相同的内存位置,我们如何确保互斥?进程中类的静态变量将在该进程中包含的每个线程之间共享 您可以通过创建一个带有公共静态字段的简单类来验证这一点,然后启动两个线程,让它们递增变量,看看会发生什么 如果要确保互斥,可以将变量设为私有,并且只允许通过使用synchronized关键字定义的方法访问它 class Foo { private

假设一个类的静态变量只占用一个内存位置,它是否由进程的所有线程共享?或者,是否为每个正在运行的线程创建了这样一个变量的一个内存位置


另外,如果所有线程共享相同的内存位置,我们如何确保互斥?

进程中
类的
静态变量将在该进程中包含的每个线程之间共享

您可以通过创建一个带有
公共静态
字段的简单
来验证这一点,然后启动两个
线程
,让它们递增变量,看看会发生什么

如果要确保互斥,可以将变量设为私有,并且只允许通过使用
synchronized
关键字定义的方法访问它

class Foo {

    private static int aVariable = 0;

    public static synchronized void increment() { aVariable++; }
    public static synchronized int getVariable() { return aVariable; }

}

它在线程之间共享,您可以通过使变量本身私有并仅使用同步访问器访问它来确保互斥。

静态字段由所有线程共享。JVM中只有一个字段副本

要控制对静态字段的访问,可以使用synchronized关键字或使用JDK 5.0提供的


有一种方法可以创建一个每个线程有一个实例的变量,请参见。

这是通过规范实现的还是某些JVM是如何实现的?线程的本质是共享内存。它是在语言中指定的。不过我没有提到它。