并发编程的底层原理
1.底层原理简介
在早期,JVM会将相同的.class文件(字节码文件)翻译成不同的机器指令,在不同操作系统的平台上,无法保证一致的并发安全。因此,需要有一个规范来保证安全一致的并发安全效果。
2.JVM内存结构
JVM内存结构是和Java虚拟机的运行时区域相关的结构。其结构图和各结构作用如下所示。
堆:堆是用来存放实例对象的内存空间。如果这些实例对象不再被引用时,会被垃圾回收器回收。堆的内存空间是动态分配的。
虚拟机栈:虚拟机栈是用来存放Java基本数据类型以及对象引用的存储空间。在编译的时候就确定了大小,并且在运行时不会改变大小。
方法区:方法区是用来存放已经加载的静态变量、类信息、常量信息以及永久引用(如static修饰的对象)的存储空间。
本地方法栈:本地方法栈是用来存放本地方法(native修饰的方法)执行时所产生的数据的内存空间。
程序计数器:程序计数器是用来存放当前线程正在执行的字节码的行号信息的内存空间。
3.Java内存模型
Java内存模型(JMM)是和Java并发编程相关的模型,是需要各个JVM的实现来遵守的一组规范,以便开发者可以利用这些规范,开发多线程程序。如果没有这个规范,那么很可能会出现同一份多线程代码在不同的虚拟机上运行的结果不一样。
Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。而JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步,其结构图如下所示。