先给出来,Java内存模型:
PC寄存器、Java虚拟机栈、本地方法栈
Java堆、方法区
线程、工作内存、主内存的关系如下图
JVM将内存组织为主内存和工作内存两个部分。
主内存是所有的线程所共享的,主要包括本地方法区和堆。
每个线程都有一个工作内存不是共享的,工作内存中主要包括两个部分:
1:一个是属于该线程私有的栈;
2:对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。
1.所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的
2.每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
3.线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成,即:线程、主内存、工作内存。
Java特性:原子性、可见性、有序性
1、原子性(操作是不可分、操作不可被中断):是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。(synchronized、Lock)
2、可见性(保障数据的一致,数据安全一部分):是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。(Volatile、Synchronized)
通过volatile关键字修饰内存中的变量,该变量在线程之间共享 。其实对于可见性而言,无论是普通变量还是volatile变量都是如此,区别在于:volatile的特殊规则保证了volatile变量值修改后的新值立刻同步到主内存,每次使用volatile变量前立即从主内存中刷新,因此volatile保证了多线程之间的操作变量的可见性,而普通变量则不能保证这一点。
3、有序性(按照自己想要执行的顺序执行线程):有序性是指程序在执行的时候,程序的代码执行顺序和语句的顺序是一致的。 (Join)
参考链接:
https://blog.csdn.net/zxh476771756/article/details/78685581