收藏首页投稿(暂停使用,暂停投稿)程序员

Java 并发编程(1): Java 内存模型(JMM)

2016-07-07  本文已影响1084人  沪上最强亚巴顿

1. 并发编程

1.1 并发编程的挑战

并发编程的目的是为了加快程序的运行速度, 但受限于上下文切换和死锁等问题, 启动更多的线程并非能让程序最大限度地并行执行.

1.1.1 上下文切换

1.1.2 死锁

1.2 资源限制的挑战

只有在串行执行会浪费资源时, 将其修改为并行执行才能加快运行速度.

2. Java 内存模型(JMM)

现代软硬件的共同目标: 在不改变程序执行结果的前提下, 尽可能提高并行度.

2.1 内存模型的基础

2.2 JMM 的抽象结构

2.3 处理器和内存的交互, 内存屏障(Memory Barriers / Memory Fence)

屏障类型 指令示例
LoadLoad Barries Load1; LoadLoad; Load2
StoreStore Barries Store1; StoreStore; Store2
Load�Store Barries Load1; LoadStore; Store2
StoreLoad Barries Store1; StoreLoad; Load2

2.4 happens-before

2.4.1 happens-before 的定义

2.4.2 happens-before 规则:

2.4.3 程序顺序规则

2.5 重排序

2.5.1 数据依赖性

2.5.2 as-if-serial 语义

2.5.3 从源码到指令序列的重排序

2.5.4 JMM 的设计初衷

2.5.5 JMM 对待重排序的策略

2.5.6 控制依赖关系

2.6 顺序一致性

2.6.1 数据竞争与顺序一致性

2.6.2 顺序一致性内存模型

未同步程序在JMM 中的执行, 整体是无序的, 其执行结果无法预知. 而在顺序一致性模型中, 所有线程看到的是一个一致的整体执行顺序.

2.6.3 未同步程序的执行特性

上一篇下一篇

猜你喜欢

热点阅读