个人简介

Echo Blog


江湖无名 安心练剑
  • 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