成员变量、局部变量在java中的存放位置

成员变量,线程共享
以基本数据类型或引用数据类型为成员变量,变量值都是在堆中存放的。

局部变量,线程私有

  • 基本数据类型,参数和参数值在Java虚拟机栈中存放的。
  • 引用数据类型,参数在Java虚拟机栈中存放的,参数值是对象实例,在堆中存放的。

顺便解释下,多线程环境下为什么会产生数据安全问题?
局部变量是线程私有,所以不会产生数据安全问题。成员变量是在堆中存放的,线程共享的,有数据安全问题。
从Java内存模型角度来看,线程有本地的工作内存,里面存放的是从主内存中拷贝来的变量副本,变量修改后,会先写入到工作内存中,主内存中不会马上更改,这是造成数据安全问题的主要原因。

你可能感兴趣的:(java,jvm,多线程)