JMM是Java并发编程的基础模型,包含了逻辑架构和CPU物理架构的知识,JMM是并发专题的难点,加油。
内容大纲
- 并行和并发
- 并发三大特性
- CPU硬件架构和缓存一致性
- JMM
- 可见性和volatile、lock前缀指令
- 有序性和指令重排、内存屏障
- 原子性
1.并发和并行
现代计算机模型中,CPU的最小调度单元就是线程,在OS中,县城管就是进程中的一条执行流程,同一个进程中多个线程可以共享代码片段、数据段、打开的文件等,但是每个线程都有专属自己的寄存器、栈结构。
1.1 并行
并行
:在同一时刻,有多条指令在多个CPU核心上同时执行。
1.2 并发
并发
:在同一时刻,同一个CPU核心上只能执行一条指令,多个线程被快速的调度切换来占用CPU核心的计算资源,在微观尺度上并不是同时执行,但在人类感触宏观表现是同时执行。并发的概念可以在单核架构存在,多核和多CPU同样也存在线程并发的概念。
2.并发三大特性
2.1 可见性
当一个线程修改了某个共享变量的值,其它线程应当能够立即看到修改后的值。Java使用共享内存模式来刷新内存方式来保证可见性。并发可见性问题的解决手段有:
- volatile关键字(Java关键字)
- 内存屏障
- synchronized关键字保证(Java关键字)
- CPU的lock前缀指令
- final关键字保证(Java关键字)
2.2 有序性
程序执行代码指令的顺序应当保证按照程序指定的顺序执行,即便是编译优化,也应当保证程序源语一致。并发有序性问题的解决手段有:
- volatile关键字
- 内存屏障
- synchronized关键字
- lock前缀指令
2.3 原子性
一个或多个程序指令,要么全部正确执行完毕不能被打断,或者全部不执行。Java中,对基本数据类型的变量读取和赋值都是原子性操作(64位处理器),但是在32位处理器上对64位数据不能保证,例如Long/Double的计算。并发的原子性问题解决手段有:</