1-JMM和volatile
2021-05-28 17:46:51 1 举报
AI智能生成
JMM模型、volatile、可见性
作者其他创作
大纲/内容
1、八大原子操作
主内存
<ul><li><span style="font-size: inherit;">l</span><b style="font-size: inherit;">ock(锁定):</b><span style="font-size: inherit;">把一个变量标记为<font color="#c41230"><b>一条线程独占状态</b></font></span></li></ul>
<ul><li><b style="font-size: inherit;">unlock(解锁)</b><span style="font-size: inherit;">:把一个处于<font color="#c41230"><b>锁定状态的变量释放出来</b></font>,释放后 的变量才可以被其他线程锁定</span></li></ul>
<ul><li><b style="font-size: inherit;">read(读取)</b><span style="font-size: inherit;">:把一个变量值从主内存</span><font color="#c41230" style="font-size: inherit;"><b>传输到线程的工作内存</b></font><span style="font-size: inherit;"> 中,以便随后的load动作使用</span></li></ul>
<ul><li><b>load(载入):</b>把read操作从主内存中得到的变量值<font color="#c41230"><b>放入工 作内存的变量副本中</b></font></li></ul>
工作内存
<ul><li><span style="font-size: inherit;"><b>use(使用)</b>:把工作内存中的一个变量值<font color="#c41230"><b>传递给执行引擎</b></font></span></li></ul>
<ul><li><b>assign(赋值)</b>:把一个从执行引擎接收到的值<b><font color="#c41230">赋给工作内 存的变量</font></b></li></ul>
<ul><li><b>store(存储):</b>把工作内存中的一个变量的值<b><font color="#c41230">传送到主内存 中</font></b>,以便随后的write的操作</li></ul>
<ul><li><b>write(写入)</b>:把store操作从工作内存中的一个变量的值 <font color="#c41230"><b>传送到主内存的变量中</b></font></li></ul>
2、三大特性
原子性
概念:一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不 会被其他线程影响
<b><font color="#f15a23">可见性(volatile)</font></b><br>
<ul><li>概念:是当一个线程修改了某个共享变量 的值,其他线程是否能够马上得知这个修改的值</li></ul>
<ul><li>volatile:</li></ul>
早期:lock指令,<b><font color="#f15a23">总线锁实现</font></b>
<span style="font-size: inherit;"><font color="#c41230"><b>后期:缓存一致性协议(MESI)</b></font></span><br>
有序性
volatile可保证有序性
通过内存屏障实现
<ul><li>Load Barrier 读屏障</li></ul>
<ul><li>Store Barrier 写屏障</li></ul>
<ul><li>JVM中提供了四类内存屏障指令</li></ul>
LoadLoad:保证load1的读取操作在load2及后续读取操作之前执行
StoreStore:在store2及其后的写操作执行前,保证store1的写操作<br>
LoadStore:在stroe2及其后的写操作执行前,保证load1的读操作已读<br>
StoreLoad:保证store1的写操作已刷新到主内存之后,load2及其后的读
<font color="#f15a23">单例的懒汉式多线程指定重排后会出现问题</font>
0 条评论
下一页