-
JMM-09-summary
处理器内存模型
顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。
JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和 JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。
分类
根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存...
2018-07-30 02:22:20 |
JMM
-
JMM-08-final
基础知识
基本用法
修饰类
当用final修饰一个类时,表明这个类不能被继承。
也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。
final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
修饰方法
使用final方法的原因有两个。
第一个原因是把方法锁定,以防任何继承类修...
2018-07-29 05:23:50 |
JMM
-
JMM-07-lock ReentrantLock 可重入锁详解
为什么需要 ReentrantLock ?
既生 synchronized,何生 ReentrantLock?
每一个接触过多线程的 java coder 肯定都知道 synchronized 关键字,那为什么还需要 ReentrantLock 呢?
其实这就是 ReentrantLock 与 synchronized 对比的优势问题:
(1)ReentrantLock 使用起来...
2018-07-29 05:23:50 |
JMM
-
JMM-07-lock concurrent 包简介
concurrent 包
由于 java 的 CAS 同时具有 volatile 读和 volatile 写的内存语义,因此 java 线程之间的通信现在有了下面四种方式:
A 线程写 volatile 变量,随后B线程读这个 volatile 变量。
A 线程写 volatile 变量,随后 B 线程用 CAS 更新这个 volatile 变量。
...
2018-07-29 05:23:50 |
JMM
-
JMM-06-happens before
as-if-serial
不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。
编译器、runtime和处理器都必须遵守 as-if-serial 语义。
为了遵守 as-if-serial 语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。
但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序...
2018-07-29 04:14:02 |
JMM
-
JMM-05-volatile
“工作 5 年了,竟然不知道 volatile 关键字!”
听着刚面试完的架构师一顿吐槽,其他几个同事也都参与这次吐槽之中。
都说国内的面试是“面试造航母,工作拧螺丝”,不得不说这也是一件很悲哀的事情。
但是面试官的职责就是要知道面试人员的水平高低,这是工资的决定性过程。
你工作几年了?知道 volatile 关键字吗?
今天就让我们一起来学习一下 volatile 关键字,做一个...
2018-07-27 03:31:20 |
JMM
-
JMM-04-sequentially consistent
数据竞争
竞争
当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:
在一个线程中写一个变量,
在另一个线程读同一个变量,
而且写和读没有通过同步来排序。
当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。
如果一个多线程程序能正确同步,这个程序将是一个没有数...
2018-07-27 01:24:45 |
JMM
-
JMM-03-cache & reordering
缓存
为了提升性能,JVM 做了 2 件事情。
缓存+重排序
为什么会出现线程可见性问题
要想解释为什么会出现线程可见性问题,需要从计算机处理器结构谈起。
我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。
CPU要与内存进行交互,如读取运算数据、存储运算结果等。
由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利...
2018-07-26 15:14:31 |
JMM