java内存模型
2022-01-21 11:36:22 18 举报
java 模型
作者其他创作
大纲/内容
无实际意义,起占位作用(8倍数对齐)
使用 openjdk的 jol-core 查看对象头信息
Klass* _klass
0
t2
-XX:-UseBiasedLocking 禁用偏向锁
01
指向互斥量的指针
工作内存
指向栈中锁记录的指针
获取当共享值static flag = true
成员变量
主内存
1
00
2bit
主内存中的数据,对所有线都具有共享,
实例数据
main
Mark Word
锁标志位
hotspot源码中定义:
ThreadID(54bit)Epoch (2bit)
31bit
线程1
修改flag = false
Klass pointer
可见性问题一个线程对数据的修改造成其他线程的不可见性
cms_free
主内存static flag = true
无锁
共享变量 如: obj = true
volatile 加入 将不再通过告诉缓存中国获取数据,而是直接从主内存中获取结果
分代年龄
对变量进行volatile 修饰
OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 a4 ba 5f (00000001 10100100 10111010 01011111) (1606067201) 4 4 (object header) 13 00 00 00 (00010011 00000000 00000000 00000000) (19) 8 4 (object header) 43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253) 12 1 boolean User.age false 13 3 (alignment/padding gap) 16 4 java.lang.String User.name null 20 4 (loss due to the next object alignment)Instance size: 24 bytesSpace losses: 3 bytes internal + 4 bytes external = 7 bytes total
64bit 虚拟机 对象头 Mark Word中的存储结构
4bit
1bit
JMM
主内存static flag = false
锁状态
java 对象模型
不可见性
解决方案
volatile只能保证可见性,不能保证原子性synchronized 既可以保证可见性,也可以保证原子性,但由于本身属于重量级锁,所以性能较低。
高速缓存导致无法对主内存的数据进行及时更新
markOop _mark
对齐填充
10
unused
轻量级锁
hashcode
偏向锁
在没有改变其他条件下,修改了某个线程的某个数据,共享到主存中,但是造成了 对其他线程的不可见行
获取当共享值volatile static flag = false
25bit
对象头
线程2
高速缓存
重量级锁
主内存volatile static flag = false
0 条评论
下一页