前面的内容都是从java平台本身提供的机制角度来介绍线程安全,现在开始介绍面向对象的角度保障线程安全的常用技术
我们先了解Java运行时的存储空间
堆空间和非堆空间是可以被多个线程共享的,而栈空间是线程私有空间,每个线程都有栈空间
栈空间:每个线程在创建时都会被分配一段固定大小的内存空间,一经分配其大小不再改变;线程执行一个方法时,在栈空间中为该方法创建一个栈帧,用于存储相应方法的局部变量,返回值,私有数据。一个线程无法访问另一线程的栈空间
堆空间:在Java虚拟机启动时分配的一段可动态扩容的内存空间,堆空间被多个线程共享,堆空间也是垃圾回收器的工作场所,堆空间可进一步分成年轻代、年老代,垃圾回收器对新生代回收叫次要回收,次要回收幸存下来的最终可能被移入年老代;对年老代的回收被称为主要回收
非堆空间:也是java虚拟机在启动时分配的一段可动态扩容的内存空间,用于存储常量、类的元数据(类的静态变量、类有哪些方法、方法的元数据:名称、参数、返回值等)。也是多个线程之间共享的存储空间
今天就介绍到这里,最后提个思考:为啥我们常说栈溢出,而不说堆溢出呢?
更多内容,可关注微信公众号