第三章 Java内存模型

一、java内存模型的基础

1、关键问题

在并发编程中,主要要处理两个关键问题,即线程间的通信同步。线程通信机制有两种,一种是共享存储,一种是消息传递。同步主要是指程序中用于控制不同线程间操作发生的相对顺序的机制。

2、java内存的抽象模型

Java线程之间的通信由JMM进行控制,抽象内存模型如下图:
java内存模型抽象结构示意图
JMM通过控制主内存与每个线程对应的本地内存的交互,来为java程序员提供可见性的保证。

3、重排序

重排序主要分为三种:
1、编译优化的重排序;
2、指令级并行重排序;
3、内存系统重排序,由于处理机使用读写缓存,使得加载和存储操作看上去是乱序执行的。

4、并发编程模型分类

不同处理机底层对于重排序的约束是不同的。

5、happens-before

A happens-before B意思是指A的操作结果于B处是可见的。

二、重排序

重排序是编译器和处理器为了优化程序性能,对指令进行重新排序的一种手段。

如果两个操作对一个变量进行访问,且至少有一个操作是写操作,则我们称这两个操作存在数据依赖。编译器和处理器不会改变有数据依赖的两个操作的顺序。

as-if-serial的语义是指不管怎样重排序,单线程的执行结果不会发生改变。重排序要遵循as-if-serial语义。

在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果,但是在多线程中,如果没能正确同步,则可能改变执行结果。

三、顺序一致性

顺序一致性模型主要有两大特征:
1、一个线程中所有操作必须按序执行;
2、所有线程都只能看到单一的执行顺序。在顺序一致性模型中,每个操作必须是原子的,且立刻对所有线程可见。
JMM保证,如果程序是正确同步的,则执行将具有顺序一致性,即结果与程序在顺序一致性模型下得到的结果一致。

四、volatile内存语义

volatile变量自身具有下列性质:
1、可见性:对于一个volatile变量的读,总是能看到(任意线程)对该变量最后的写;
2、原子性:对volatile变量的读/写具有原子性,但其复合读写并不具备原子性。

volatile的内存语义:
当写一个volatile变量时,JMM会将该线程的本地内存共享变量刷新到主内存中,当读一个volatile变量时,会将本地内存的共享变量置为无效,然后从主内存中读取。

volatile语义是通过插入内存屏障实现的。volatile实现了变量的可见性。

五、锁的内存语义

在线程释放锁时,会将该线程的本地内存共享变量刷新到主内存中,当获得锁时,会将本地内存的共享变量置为无效,然后从主内存中读取。

六、final域的内存语义

在对象引用为任意线程可见之前,对象的fianl已经被初始化过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值