1、Java内存模型的概念
Java内存模型规范时抽象的概念,描述的是程序间变量的访问规则(多线程程序允许表现出的行为),Java线程内存模型与CPU缓存内存模型类似,他是标准化的,用于屏蔽各种硬件和操作系统的内存访问差异。
JMM-8大数据原子操作:
1. lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态。
2. unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
3. read(读取):把一个变量值从内存传输到线程的工作内存中,以便于随后的load动作使用。
4. load(载入):把read操作从主内存中得到的变量值放入工作内存的变量副本中。
5. use(使用):把工作内存中的一个变值传递给执行引擎。
6. assign(赋值):把一个执行引擎接收到的值赋给工作内存的变量。
7. store(存储):把工作内存中的一个变量的值传到主内存中,以便随后的write的操作。
8. write(写入):把store操作从工作内存中的一个变量的值传送到主内存的变量中。
1. 可见性
多个线程操作同一个共享变量,当一个线程修改类共享变量的值时,其他线程都能够及时的看到该变量的改变。
2. 原子性
3. 有序性
2、volatile可见性底层实现原理
Volatile可见性实现原理:
1. 底层通过汇编lock前缀指令触发底层缓存锁机制(缓存一致性协议&总线锁)。例如触发MESI协议,lock指令会出发锁定变量缓存行区域并回写主内存,这个操作称为:缓存锁定。
2. 缓存一致性机制会阻止同时两个以上处理器缓存的内存区域数据被修改(MESI协议)。
3. 一个处理器的缓存会写到内存,内存会导致其他处理器的缓存无效(MESI协议)IA-32架构。
缓存一致性协议MESI:
M:已修改
E:独占
S:共享
I:已失效
3、并发存在的问题
多线程编程中,有可能出现多个线程同时访问统一个共享、可变资源的情况,这种资源可能是:对象、变量、文件等。
共享:资源可以由多个线程同时访问。
可变:资源可以在其生命周期内被修改。
存在的问题:
由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问,例并发访问HashMap集合。
压测工具推荐: Apache JMeter
4、AQS
AQS(AbstractQueuedSynchronizer):
抽象队列同步器,为了保证高并发环境下的线程安全。使用纯Java实现其功能等同于synchronized关键字,区别在于synchronized关键字底层使用的是C语言实现的。
以上为个人总结的一些笔记,若有雷同纯属巧合,若有错误欢迎指出,谢谢!