Java JMM/volatile/CAS/

一、JMM

  1. JMM是Java Memory Model(Java 内存模型)的简称,它是一组规范,目的是屏蔽系统和硬件的差异,是一个抽象的概念,并不真实存在。

    A. 线程解锁前,必须要把共享的变量值刷新回主内存;

    B. 线程加锁前,必须读取主内存的最新值到自己的工作内存;

    C. 必须是一把锁。

  2. JMM模型特征

    A. 原子性:一个或多个操作要么全部执行并且执行的过程中不会被任何因素打断,要么就都不执行。【java.concurrent.Atomic.* 都是原子类】

    B. 可见性:每个工作线程都有自己的工作内存,所以当某个线程修改完某个变量之后,在其他的线程中,未必能观察到该变量已经被修改

    C. 有序性:程序执行的顺序应按照代码的先后顺序执行

  3.  内存交互操作

    A. lock(锁定):作用于主内存的变量,把一个变量表示线程独占状态;

    B. unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定;

    C. read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用;

    D. load(载入):作用于工作内存的变量,它把read操作从主存中变量放入工作内存中;

    E. use(使用):作用于工作内存中的变量,它把工作内存中的变量传输给执行引擎,每当虚拟机遇到一个需要使用到变量的值,就会使用到这个指令;

    F. assign(赋值):作用于工作内存中的变量,它把一个从执行引擎中接受到的值放入工作内存的变量副本中;

    G. store(存储):作用于主内存中的变量,它把一个从工作内存中一个变量的值传送到主内存中,以便后续的write使用;

    H. write(写入):作用于主内存中的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

二.、volatile

  1. volatile是Java提供的一种轻量级的同步机制,它不会引起线程上下文切换和调度

  2. volatile特性

    A. 保证可见性;

    B. 不保证原子性,原子性的保证可以使用Atomic包下原子类;

    C. 禁止指令重排,指令重排是编译器和处理器为了优化程序性能而对指令序列进行排序的一种手段,在单线程下,不管如何排序,结果不会变。

  3. volatile原理

    JVM底层voldatile是采用“内存屏障”来实现的

    A. 它确保指令重排序时不会把后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障之后的位置;

    B. 它会强制对缓存的修改操作立即写入内存;

    C. 如果是写操作,它会导致其他CPU中对应的缓存无效。

三、CAS

猜你喜欢

转载自www.cnblogs.com/ruhuanxingyun/p/12349936.html