JVM中的虚拟机栈是描述java方法执行的内存区域,他是线程私有的。
每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。在活动线程中,只有位于栈顶的帧才是有效的,称为当前栈帧。正在执行的方法称为当前方法,栈帧是方法运行的基本结构。
多线程环境下,操作同一份数据(同一块内存空间),就有可能产生数据安全问题。
成员变量:无论是基本数据类型,还是引用数据类型,数据都只有一份,所以多线程下可能不安全。解决安全问题:1、往每一个线程中都复制一份Threadlocal,2、加同步。java也有线程安全的已有类,如ConcurrentHashMap等等
局部变量:由于局部变量定义在方法内部,而方法在Java栈中执行,Java栈是线程私有的。所以局部变量应该都是线程安全的。(无论是基本数据类型,还是引用数据类型,只要是局部变量都是安全的)
注:方法在Java虚拟机栈中执行,而Java栈是线程私有的。
就是每一个线程都有自己私有的Java栈内存空间,Java栈中执行方法,每一个方法就是一个栈帧。
所以,定义在方法中的局部变量是线程安全的。
而成员变量,多个线程都可以访问(访问这同一块内存空间),就可能产生数据安全问题。
网友评论