美文网首页
java内存模型

java内存模型

作者: 陈桐Caliburn | 来源:发表于2020-05-29 14:32 被阅读0次

java内存模型基础

并发编程,两个关键问题:线程通信和线程同步
通信机制:共享内存和消息传递

java并发采用共享内存模型,通信是隐式调用的,
编写多线程出现内存可见性问题

java内存模型

1)线程A把本地内存A更新过的共享变量刷新到主内存中去
2)线程B到主内存中去读取线程A之前已更新过共享变量

为提高性能,进行指令重排

happens-before
如果一个操作结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系

as-if-serial语义:不管怎么重排序,程序的执行结果不能被改变。
为了遵循as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序

目标:在不改变执行结果的前提下,尽可能提高并行度

java内存模型一致性

1、一个线程中所有操作必须按照程序的顺序来执行
2、所有线程都只能看到一个单一操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见

JMM中,临界区内代码可以重排序

同步原语

volatile内存语义
当一个volatile变量时,JMM会把本地内存中共享变量值刷新到主内存

防止指令重排


临界区互斥执行,还可以让释放锁的线程向获取同一个锁的线程发生消息

锁内存含义

AbstractQueuedSynchronizer

juc实现底层原理

final内存含义

1、final修饰,在构造方法中,不能指令重排
2、初次读包含final域对象,与初次读对象中final域,不能指令重排
3、只要对象正确构造(没有内存溢出),final修饰线程安全

Double Check
volatile作用:防止指令重排

memory = allocate() //1、分配对象内存空间
ctorInstance(memory) //2、初始化对象
instance = menory //3、设置instance为memory

2、3重排 ,导致instance未正确初始化

java内存模型设计

相关文章

网友评论

      本文标题:java内存模型

      本文链接:https://www.haomeiwen.com/subject/pjmxzhtx.html