并发编程之JMM

一、JMM定义

Java内存模型即Java Memory ModelJMM)JMM决定一个线程对共享变量的写入何时对另一个线程可见内存可见性),从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本

二、JVMJava内存模型的实现

三、硬件内存架构

四、支撑Java内存模型的基础原理

1、指令重排序

在执行程序时,为了提高性能,编译器和处理器会对指令做重排序,JMM可以通过插入特定类型的Memory Barrier来禁止。volatile的实现(如果一个变量是volatile修饰的,JMM会在写入这个字段之后插进一个Write-Barrier指令,并在读这个字段之前插入一个Read-Barrier指令)

2、as-if-serial

不管怎么重排序,单线程下的执行结果不能被改变,编译器、runtime和处理器都必须遵守as-if-serial语义。

3、内存屏障(Memory Barrier

或内存栅栏,是一个CPU指令

4、happens-before

在JMM中,如果一个操作的执行结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系,这个的两个操作既可以在同一个线程,也可以在不同的两个线程中。
1、程序顺序规则:一个线程中的每个操作,happens-before于该线程中任意的后续操作。
2、监视器锁规则:对一个锁的解锁操作,happens-before于随后对这个锁的加锁操作。
3、volatile域规则:对一个volatile域的写操作,happens-before于任意线程后续对这个volatile域的读。
4、传递性规则:如果 A happens-before B,且 B happens-before C,那么A happens-before C。
注意:两个操作之间具有happens-before关系,并不意味前一个操作必须要在后一个操作之前执行!仅仅要求前一个操作的执行结果,对于后一个操作是可见的。

 

Ref:

https://blog.csdn.net/lxm55913153/article/details/79208126

猜你喜欢

转载自my.oschina.net/u/3787772/blog/2086094