Java并发编程实战 - 第16章 Java内存模型

指令重排序

Java 语言规范规定了JVM线程内部维持一种类似串行语义:只要程序的最终结果与在严格串行环境中执行的结果相同,指令的执行顺序可以与代码的顺序不一致。这个技术叫指令的重排序。指令重排序存在的意义在于:JVM 能够根据处理器的特性(CPU的多级缓存系统、多核处理器等)重新排序机器指令,使机器指令更符合CPU的执行特点,最大限度的发挥机器的性能。

Happens-before规则

Java内存模型(JMM)为程序中所有操作定义了一个偏序关系,称为Happens-Before,保证可见性。
要想操作B的线程看到操作A的结果(无论A和B是否在一个线程中执行),那么A和B之间一定要满足Happens-Before关系。
如果两个操作之间没有Happens-Before关系,那么JVM可以对它们任意地重排序,可能产生奇怪的操作结果。

Happens-Before规则包括:
1. 程序顺序规则:同一个线程中的每个Action都必须happens-before出现在其后的任何一个Action。

2. 监视器锁规则:在监视器锁上的unlock操作必须happens-before 同一监视器上的lock操作。

3. volatile变量规则:对一个volatile变量的写操作必须happens-before对该变量的读操作。

4. 线程启动规则:在线程上start()方法的执行必须happes-before在该线程中执行任何其他操作。

5. 线程终止规则:线程中的任何操作都happens-before其他线程检测到该线程已经结束,或者从Thread.join()方法返回,或者调用Thread.isAlive()时返回false。

6. 线程中断规则:一个线程对另一个线程interrupt()方法的调用必须happens-before在被中断线程的代码检测到interrupt()调用。

7. 终结器规则:一个对象的初始化完成(构造函数执行结束)happens-before启动该对象的finalize()方法。

8. 传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么一定A happens-before操作C。

示例:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
真正的Addison-Wesley 出品的Java Concurrency in Practice 中文版 目录回到顶部↑ 代码清单 序 第1 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 线程的风险 1.4 线程无处不在 第1部分 基础 第2 线程安全 2.1 什么是线程安全性 2.2 原子性 2.3 锁 2.4 用锁来保护状态 2.5 活跃度与性能 第3 共享对象 3.1 可见性 3.2 发布和逸出 3.3 线程封闭 3.4 不可变性 3.5 安全发布 . 第4 组合对象 4.1 设计线程安全的类 4.2 实例限制 4.3 委托线程安全 4.4 向已有的线程安全类添加功能 4.5 同步策略的文档化 第5 构建块 5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 处理反常的线程终止 7.4 jvm关闭 第8 应用线程池 8.1 任务与执行策略问的隐性耦合 8.2 定制线程池的大小 8.3 配置threadpoolexecutor 8.4 扩展threadpoolexecutor 8.5 并行递归算法 第9 gui应用程序 9.1 为什么gui是单线程化的 9.2 短期的gui任务 9.3 耗时gui任务 9.4 共享数据模型 9.5 其他形式的单线程子系统 第3部分 活跃度,性能和测试 第10 避免活跃度危险 第11 性能和可伸缩性 第12 测试并发程序 第4部分 高级主题 第13 显示锁 第14 构建自定义的同步工具 第15 原子变量与非阻塞同步机制 第16 java存储模型 附录a 同步annotation 参考文献 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值