JMM是一种规范,它的作用是屏蔽硬件和操作系统访问内存的差异性,来实现java程序在各平台下达成一致的并发效果,JMM规范了JVM和计算机内存协调工作:规定了一个线程如何和何时能看到由其他线程修改的共享变量的值,以及在必要时如何同步的去访问共享变量的值。围绕着在并发过程中如何处理可见性、原子性、有序性这三个特性而建立的模型。
原子性:同一时刻只有一个线程对共享变量做操作
Atomic包下的类,使用CAS操作保证原子性,CAS操作就是当前线程工作内存的值跟主内存中的值进行比较,一直循环,只有相等的时候才执行对应的操作。
synchronized通过锁保证原子性,lock通过锁保证原子性
可见性:可以看见其他线程对共享变量的更新
Volatile通过内存屏障保证可见性和防止指令重排序,被Volatile修饰的变量,在读的时候都会去主内存中去读取最新的值,在写后都会将最新的值刷新到主内存。
Synchronized规定在锁定变量前,先将工作内存的变量清掉,当需要该变量时,拿去主内存中的最新值。在解锁前,将最新的值刷到主内存。
注:Volatile不能保证原子性,不适应于计数的场景,适用于做标注判断
有序性:java程序天生的有序性(满足happen-before原则),java内存模型中允许编译器和处理器对指令进行重排序(不满足happen-before原则),在单线程下没有影响,在多线程下影响运行结果。
Volatile/Synchronized/Lock都可以保证有序性。
Java内存模型(Java Memory Model,JMM)
最新推荐文章于 2023-06-18 16:51:05 发布