Java内存模型(JMM)知识整理

Java内存模型的主要目标定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

一、主内存和工作内存

1、主内存:类似物理硬件的主内存,是所有线程共享的。线程间变量值的传递均需通过主内存来完成。
2、工作内存:每个线程自己的独有内存,这里保存了在线程中需要使用的主内存数据的副本(只是要用的那部分),线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量。
他们之间的关系如下:
在这里插入图片描述

二、内存间交互操作

1、JMM中的8种操作
1)lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
2) unlock(解锁):作用于主内存的变量,它把一个被锁定的变量解除锁定,使得该变量能边其它线程锁定。
3)read(读取):作用于主内存的变量,它把主内存中的变量值传到工作内存中,供load操作使用。
4)load(载入):作用于工作内存的变量,它把read操作读到的值放到工作内存中的变量副本中。
后一个操作只能是use操作
5)use(使用):作用于工作内存的变量,当每次需要使用变量值时,都会用到这个操作。
前一个操作只能是load操作
6)assign(赋值):作用于工作内存的变量,每次给变量赋值时都会用到这个操作。
后一个操作只能是store操作
7)store(存储):作用于工作内存的变量,将工作内存中的变量值传到主内存中,供write使用。
前一个操作只能是assign操作
8)write(写入):作用于主内存的变量,将store操作传来的值放到主内存中相应的变量中。

注:
①read和load、store和write不能单独出现,只能成对出现
②不允许线程丢弃assign操作,变量只要改变了就必须同步到主内存中去。
③不允许在没有发生assign操作,直接用store操作,即store操作前必须是一个assign操作。
④一个新的变量必须在主内存中诞生,不能使用一个未被初始化的变量。
⑤主内存的变量允许重入锁,即允许对一个变量加多个锁,而且加了几个锁就要相应释放几个锁,才能解锁这个变量。
⑥对一个变量解锁前,必须先把这个变量值写回到主内存中。

三、volatile变量

1、两个语义:
1)保证它修饰的变量对所有线程保持可见性,即一个线程修改了这个值,新值对于其他线程都是可见的。
2)禁止指令进行重排序优化(在懒汉式单例模式的应用)

2、volatile不具有原子性,所以对于非原子性的操作,仅仅使用volatile修饰是不能保证线程的安全的,这个时候还是得对非原子性的操作加上synchronized关键字,以保证操作的原子性,实现线程安全。

3、volatile的使用场景:
1)运算结果跟变量的当前值没有什么关系,即变量的当前值是什么对运算结果没有影响
2)能够确保只有单一的线程修改变量的值
3)变量不需要与其他的状态变量共同参与不变约束

4、禁止指令重排序的原理
有volatile修饰的变量在赋值后多执行了一个加锁操作,相当于实现了一个内存屏障,指令重排序时不能把屏障后的指令排到前面去,所以就实现了多线程时的禁止指令重排序。

四、JMM的三大特性

1、原子性:几个关联的操作要么一起成功,要买一起失败。
2、可见性:一个线程修改了变量的值,另一个线程可以get到。
3、有序性:在本线程内观察,所有操作都是有序的,一个线程观察另外一个线程,所有操作都是无序的。
synchronized对于这三个特性都可以实现。但是volatile不支持原子性操作。

五、happens-before(先行先发生原则)

即满足happens-before原则的操作都是线程安全的。
先行先发生是什么?
比如A操作先行发生于B操作,就是在发生B操作之前,操作A产生的影响能被B操作观察到,影响包括了共享变量的修改,传递消息等操作。

1、程序次序规则:在一个线程内,按控制流顺序,书写在前面的操作先行发生于书写在后面的操作
2、管程锁定规则:一个unlock先行发生于后一个对同一个锁的lock操作(比如synchronized保证线程的同步)
3、volatile变量规则:volatile变量的写操作先行发生于读操作
4、线程启动规则:Thread的start()方法先行于该线程的每一个动作
5、线程终止规则:线程的所有操作先行于线程的终止检测操作。
6、线程中断规则:对线程interrupt()的调用先行于被中断线程的中断检测。
7、对象终结规则:对象的初始化先行于它的finalsize()
8、传递性:操作A先行于B,B先行于C,则A先行于C

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值