Java虚拟机--Java内存模型与线程

缓存一致性问题

在这里插入图片描述

###并发编程模型
线程之间的通信机制有两种:共享内存和消息传递

  • 消息传递的并发模型(同步隐式进行)
    eg:主内存中有变量x=0;线程A和线程B都会对它进行自增操作。线程A先对x做自增操作,此时线程A会将主内存中的x=0复制一份到本地内存并进行自增x=1。当线程A与线程B通信的时候,线程A会首先把本地内存中的x刷新到主内存中,完成隐式同步。
  • 共享内存的并发模型(同步显式进行,程序员需显式指定代码需要在线程之间互斥执行)

重排序

在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序主要分三种类型:

  • 编译器重排序
  • 处理器重排序-指令级并行重排序
  • 处理器重排序-内存系统重排序

内存屏障

为了保证内存可见性,java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序
这里写图片描述

happens-before

从JDK5开始,java使用新的JSR -133内存模型(本文除非特别说明,针对的都是JSR- 133内存模型)。JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。
与程序员密切相关的happens-before规则如下:

  • 程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
  • 监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
  • volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。
  • 传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值