知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。java
1.Java内存模型是每一个java程序员必须掌握理解的程序员
2.Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节缓存
3.Java的并发采用的是共享内存模型安全
4.Java内存模型:JMM(Java Memory Model)并发
5.JMM规定了全部的变量都存储在主内存(Main Memory)性能
6.每一个线程还有本身的工做内存(Working Memory), 线程的工做内存中保存了该线程使用到的变量的主内存的副本拷贝学习
7.线程对变量的全部操做(读取、赋值等)都必须在工做内存中进行优化
8.不能直接读写主内存中的变量线程
9.特例:volatile变量仍然有工做内存的拷贝,特殊的操做:禁止指令重排,它须要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行,读性能消耗与普通变量几乎相同,可是写操做稍慢。3d
1、JMM,Java内存模型分为: 主内存,工做内存
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
1.Java内存模型是每一个java程序员必须掌握理解的
2.Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节
3.Java的并发采用的是共享内存模型
4.Java内存模型:JMM(Java Memory Model)
5.JMM规定了全部的变量都存储在主内存(Main Memory)
6.每一个线程还有本身的工做内存(Working Memory), 线程的工做内存中保存了该线程使用到的变量的主内存的副本拷贝
7.线程对变量的全部操做(读取、赋值等)都必须在工做内存中进行
8.不能直接读写主内存中的变量
9.特例:volatile变量仍然有工做内存的拷贝,特殊的操做:禁止指令重排,它须要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行,读性能消耗与普通变量几乎相同,可是写操做稍慢。
1、JMM,Java内存模型分为: 主内存,工做内存
1.1 主内存
1.2 工做内存
2、线程安全特性
2.1 原子性
2.2 可见性
2.3 有序性
3、指令重排理解
3.1 指令重排分几种
3.2 核心点
两个线程之间在执行同一段代码之间的critical area,在不一样的线程之间共享变量;因为执行顺序、CPU编译器对于程序指令的优化等形成了不肯定的执行结果。
3.3 缘由
主要仍是编译器以及CPU为了优化代码或者执行的效率而执行的优化操做;
3.3 防止指令重排
volatile关键字能够保证变量的可见性,由于对volatile的操做都在Main Memory中,而Main Memory是被全部线程所共享的,这里的代价就是牺牲了性能,没法利用寄存器或Cache,由于它们都不是全局的,没法保证可见性,可能产生脏读。
volatile还有一个做用就是局部阻止重排序的发生,对volatile变量的操做指令都不会被重排序,由于若是重排序,又可能产生可见性问题。
在保证可见性方面,锁(包括显式锁、对象锁)以及对原子变量的读写均可以确保变量的可见性。可是实现方式略有不一样,例如同步锁保证获得锁时从内存里从新读入数据刷新缓存,释放锁时将数据写回内存以保数据可见,而volatile变量干脆都是读写内存。
本文由zshipu.com学习笔记或整理或转载,若有侵权请联系,必改之。