拓冰建站拓冰建站
首页 / 资讯中心 / 正文

线程到底是个啥?JVM里它连个专属小窝都没有?

相信很多人都知道成员变量是有并发问题的而局部变量是线程安全的。那么为什么呢还有局部变量一定是线程安全吗以上就是本节讲解的重点内容。1.线程的存储结构掌握了JVM内存划分相关知识的人, 便了解JVM内存区域涵盖, 程序计数器( )、Java栈(VM Stack)、本地方法栈( Stack)、方法区( Area)、堆(Heap)。方法区又名为永久代, 于JDK1.8之后, 以元空间替换了永久代, 并且常量以及静态变量也被转移至Java堆里。JDK1.8之前常量、静态变量是存放于方法区当中。当我们弄出新的线程之时, JVM就会给线程弄出一个栈, 栈对于线程来讲有私有的特性, 每个线程都存在属于自身单独而成的栈。当线程运行中实行一个方法之际, 会弄出一个栈帧, 栈帧里涵盖局部变量表(Local )、操作数栈( Stack)、指向当前方法所属的类的运行时常量池运行时常量池的概念在方法区部分会谈到的引用( to pool)、方法返回地址( )以及一些额外的附加信息, 如下图所示:有的线程, 会拥有上图里的一个栈。栈当中的数据, 是其所私有的, 不存在有会并发的问题。方法里的局部变量, 会被存储在局部变量表中, 这里面涵盖非静态变量, 还有方法的参数。要是属于基本类型, 那就存储其值, 对于引用类型而言, 存储的是引用。操作数栈是临时存储区域通过入栈和出栈来访问数据。1.成员变量为什么是线程不安全的有成员变量, 其存在静态与非静态的类别划分。若要剖析它们是不是线程安全的情况, 那就要判定它们到底是属于线程共享的类型, 还是属于非共享的类型。静态变量, 于JDK1.7以前, 被保存在方法区, 此方法区亦称作永久代, 它是线程共享的, 因而静态变量并非线程安全的。JDK1.7往后, 它直接被保存在堆中, 所以同样是非线程安全的。处在堆中的非静态成员变量, 是所有线程都能共享的, 正因能被所有线程共享, 所以它不属于线程安全的范畴。2. 局部变量为什么是线程安全的从关于线程的存储结构当中我们能够知晓, 局部变量是在栈帧里的局部变量表那儿进行存储的, 并且栈乃是线程所独自拥有的, 因而这是线程安全无误的。存在着一种应对并发的解决办法, 那便是将数据共享予以消除, 要是不存在共享那自然就不会产生并发方面的问题, 这个被称作线程关闭。2.1 局部变量一定是线程安全的吗我们先看如下代码public static StringBuffer sb(String str1, String str2) { StringBuffer sb new StringBuffer(); sb.append(str1); sb.append(str2); return sb; }答案当然不是线程安全的, 这是由于局部变量sb出现了溢出情况, 进而能够被别的方法进行操作修改。Java栈帧里存放的是局部变量表, 要是属于基本类型, 存放的便是值, 自然而然是线程唯一拥有的, 是线程安全的。要是属于引用类型, 那么于局部变量表里所保存的便是该引用, 然而实际的对象依旧是保存在堆当中的, 堆里面的数据乃是所有线程所共同享有的。倘若出现了溢出情况, 那就并非线程安全的了, 要是没有发生溢出, 那依旧是线程安全的。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门