关于jmm:JMM

4次阅读

共计 777 个字符,预计需要花费 2 分钟才能阅读完成。

JMM 概念

JMM 即为 JAVA 内存模型(java memory model)。自身是一种形象的概念,并不实在存在,它形容的是一组规定或标准,通过这组标准定义了程序中各个变量(包含实例字段,动态字段和形成数组对象的元素)的拜访形式。是为了屏蔽零碎和硬件的差别,让一套代码在不同平台下能达到雷同的拜访后果。

内存划分

  • 工作内存
    对应寄存器和高速缓存
  • 主内存
    对应硬件的物理内存

线程对变量的读取和写入,间接在工作内存中操作,而不能间接去操作主内存中的变量。然而这样就会呈现一个问题,当一个线程批改了本人工作内存中变量,对其余线程是不可见的,会导致线程不平安的问题。

模型特色

  1. 原子性 – 保障指令不会受到线程上下文切换的影响

被 synchronized 关键字或其余锁包裹起来的操作也能够认为是原子的。从一个线程察看另外一个线程的时候,看到的都是一个个原子性的操作。

2. 可见性 – 保障指令不会受 cpu 缓存的影响

每个工作线程都有本人的工作内存,所以当某个线程批改完某个变量之后,在其余的线程中,未必能察看到该变量曾经被批改。volatile 关键字要求被批改之后的变量要求立刻更新到主内存,每次应用前从主内存处进行读取。因而 volatile 能够保障可见性。除了 volatile 以外,synchronized 和 final 也能实现可见性。synchronized 保障 unlock 之前必须先把变量刷新回主内存。final 润饰的字段在结构器中一旦实现初始化,并且结构器没有 this 逸出,那么其余线程就能看到 final 字段的值。

3. 有序性 – 保障指令不会受 cpu 指令并行优化的影响
java 的有序性跟线程相干。如果在线程外部察看,会发现以后线程的所有操作都是有序的。如果在线程的内部来察看的话,会发现线程的所有操作都是无序的。因为 JMM 的工作内存和主内存之间存在提早,而且 java 会对一些指令进行从新排序。

正文完
 0