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

 2019-12-10 15:58  阅读(810)
文章分类:Java Core

并发编程模型

线程之间的通信机制有两种:共享内存和消息传递

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

重排序

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

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

内存屏障

为了保证内存可见性,java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序
20191210001456\_1.png

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)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java虚拟机--Java内存模型与线程

相关推荐