Fork me on GitHub

Java内存模型

注意:所有文章除特别说明外,转载请注明出处.

[TOC]

第三章 Java内存模型

3.1 Java内存模型基础

Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

3.1.3 重排序

1. 编译器优化的重排序:编译器在不改变单线程语义的情况下,可以重新安排语句的执行顺序。

2. 指令集并行的重排序:现代处理器采用指令并行技术来将多条指令重叠执行。如果不错在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

3. 内存系统的重排序:处理器使用缓存读/写缓冲区,从而使得加载和存储操作看上去可能在乱序执行。

3.1.5 happens-before

注意:两个操作之间具有happens-before关系并不意味着前一个操作必须要在后一个操作之前执行。happens-before仅仅要求前一个操作对后一个操作可见,且前一个操作按顺序排在后一个操作之前。

3.4 volitale的内存语义

3.4.1 volatile的特性

我们理解volitle特性是将volatile变量的单个读/写看成是使用同一个锁对象对这些单个读/写操作做同步。

提示:一个volatile变量的单个读/写操作,与一个普通变量的读/写操作都是使用同一个锁来同步,它们之间执行效果一样。

提示:锁的happen-before规则保证释放锁和获取锁的两个线程之间的内存可见性,意味着对一个volatile变量的读,总是能看到对这个volatile变量最后的写入。

总结:volatile变量具有以下特性:1.可见性,对于一个volatile变量的读,总是能看到对这个volatile变量最后的写入。2.原子性,对任意单个volatile变量的读/写具有原子性。

3.4.2 volatile写-读建立的happen-before关系

从内存语义的角度来看,volatile的读-写与锁的释放-获取有相同的内存效果。

本文标题:Java内存模型

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月29日 - 11:39:11

原始链接:http://bangjinhu.github.io/undefined/第三章 Java内存模型/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.