Java内存模型学习(JMM)

  1. JMM是什么?
    Java内存模型(即Java Memory Model,简称JMM)是一个抽象的概念,真是不存在,它描述的是一种规范或者规则,定义了程序如何对变量进行访问
    JVM运行程序的实例是线程,创建每个线程,JVM都会给它开启一片工作空间(栈空间),用于存储线程私有的数据,而JMM规定所以变量都存在于主内存中,主内存是共享区域,但是每个线程工作的时候都是在自己的工作内存中实现的,需要从主内存把变量拷贝过来,再对变量进行修改,修改完毕后将新的值刷新到主内存中。线程不能直接操作主内存的值,只能对拷贝过来的变量进行操作,也只能对自己的私有数据进行操作,不能对其余线程的数据进行操作,和其余线程进行通信时要通过主内存来完成。
    ==
    主内存:Java创建的所有对象都会放在这里,不论是全局变量还是局部变量
    工作内存:线程工作时候的内存空间,操作的变量是从主内存中拷贝过来的副本,变量被修改后再刷新到主内存,多线程下,线程与线程之间是不安全的,同一线程内数据是安全的
    ==
    根据虚拟机规范,对于一个实例对象中的成员方法而言,如果方法中包含本地变量是基本数据类型(boolean,byte,short,char,int,long,float,double),将直接存储在工作内存的帧栈结构中,但倘若本地变量是引用类型,那么该变量的引用会存储在功能内存的帧栈中,而对象实例将存储在主内存(共享数据区域,堆)中。但对于实例对象的成员变量,不管它是基本数据类型或者包装类型(Integer、Double等)还是引用类型,都会被存储到堆区。至于static变量以及类本身相关信息将会存储在主内存中。

在CPU内部有一组CPU寄存器,寄存器是cpu直接访问和处理的数据,是一个临时放数据的空间。
般CPU都会从内存取数据到寄存器,然后进行处理,但由于内存的处理速度远远低于CPU,导致CPU在处理指令时往往花费很多时间在等待内存做准备工作,于是在寄存器和主内存间添加了CPU缓存,CPU缓存比较小,但访问速度比主内存快得多
2. JMM中的happen-before原则
happens-before 原则辅助保证程序执行的原子性、可见性以及有序性的问题,它是判断数据是否存在竞争、线程是否安全的依据
2.1 程序顺序原则,即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。

2.2 锁规则 解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是说,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。

2.3 volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就是,volatile变量在每次被线程访问时,都强迫从主内存中读该变量的值,而当该变量发生变化时,又会强迫将最新的值刷新到主内存,任何时刻,不同的线程总是能够看到该变量的最新值。

2.4 线程启动规则 线程的start()方法先于它的每一个动作,即如果线程A在执行线程B的start方法之前修改了共享变量的值,那么当线程B执行start方法时,线程A对共享变量的修改对线程B可见

2.5 传递性 A先于B ,B先于C 那么A必然先于C

2.6 线程终止规则 线程的所有操作先于线程的终结,Thread.join()方法的作用是等待当前执行的线程终止。假设在线程B终止之前,修改了共享变量,线程A从线程B的join方法成功返回后,线程B对共享变量的修改将对线程A可见。

2.7 线程中断规则 对线程 interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测线程是否中断。

2.8 对象终结规则 对象的构造函数执行,结束先于finalize()方法

volatile关键字的作用:
1,实现可见性,volatile修饰的变量,在修改后会直接刷新到内存中,被其与线程可见
2,禁止指令重排,volatile关键字在CPU执行的时候,会有一个lock标志,产生内存屏障(内存栅栏),告诉编译器和CPU,不论什么指令都不能和该Memory Barrier指令重新排序,也就是Memory Barrier指令前后的指令,都不会进行指令排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值