Java的内存模型
一、模型展示图
本地内存:
①其实是抽象的、不存在的,但是主内存是存在的。本地内存是主内存的副本。
二、volatile和synchronized的内存语义
java的内存屏壁的作用:
①保证内存的可见性
②禁止重排序,遵循happen-before语义
被volatile修饰的变量,在使用的过程中都是会直接读取主内存的值,而实现这个的就是这个内存屏壁发挥的作用,但是保证不了原子性。从内存中读取数据和将数据刷新到主内存中的load/read/store/write这四步是保证不了原子性的。
synchronized修饰的方法或者代码块= 内存可见+原子性。
volatile的使用条件:
①对变量的写操作不依赖当前值 如:a++;
②该变量不能存在于其他变量的不变式中 如:int b=a+1;
最实在的使用场景:
①作为一次性事件、终结条件;涉及的单方面修改
②读--写锁分离策略。读用volatile、写用对象锁。