深入理解并发可见性,有序性,原子性和JMM内存模型
2023-07-03 11:50:24 5 举报
深入理解并发可见性,有序性,原子性和JMM内存模型
作者其他创作
大纲/内容
<b><font color="#ffffff">并发三大特性</font></b>
<b><font color="#ffffff">原子性</font></b>
<b><font color="#ffffff">一个操作或多个操作,要么</font><font color="#e74f4c">全部执行</font><font color="#ffffff">且在执行过程中不被任何因素打断</font><font color="#e74f4c">,要么全部不执行</font></b>。在java中,对基本数据类型的变量的读取和赋值操作是原子性操作(64位处理器)。<b>不采取任何的原子性保障措施的自增操作并不是原子性的</b>,<b>比如i++</b>
<b><font color="#e74f4c">如何保证原子性</font></b>
<b>通过synchronized关键字保证原子性</b>
<b>通过Lock锁保证原子性</b>
<b>通过CAS保证原子性</b>
<b>可见性</b>
当<b><font color="#e74f4c">多个线程</font></b>访问同<b>一个变量</b>时,一个线程<b><font color="#e74f4c">修改</font></b>了这个变量的值,其他线程能够<b><font color="#e74f4c">立即看得到修改的值</font></b>
<b><font color="#e74f4c">如何保证可见性</font></b>
<b><font color="#e74f4c">通过volatile关键字保证可见性</font></b>
<b>通过<font color="#e74f4c">内存屏障</font>保证可见性</b>
<b>通过<font color="#e74f4c">synchronized</font>关键字保证可见性</b>
<b>通过<font color="#e74f4c">Lock锁</font>保证可见性</b>
<b>有序性</b>
<b><font color="#ffffff">程序执行的顺序按照代码的先后顺序执行</font>,为了提升性能,编译器和处理器常常会对指令做重排序,存在有序性问题</b>
<b><font color="#e74f4c">如何保证有序性</font></b>
<b>通过<font color="#e74f4c">volatile</font>关键字保证有序性</b>
<b>通过<font color="#e74f4c">内存屏障</font>保证有序性</b>
<b>通过<font color="#e74f4c">synchronized</font>关键字保证可见性</b>
<b>通过<font color="#e74f4c">Lock锁</font>保证有序性</b>
<b><font color="#ffffff">JAVA内存模型的抽象结构</font></b>
<b>java线程之间的通信</b>由java内存模型(java Memory Model,简称JMM)控制,JMM决定<b><font color="#e74f4c">一个线程对共享变量的写入何时对另一个线程可见</font></b>
根据JMM的规定,<b><font color="#ffffff">线程对共享变量的所有操作都必须在</font><font color="#e74f4c">自己的本地内存</font><font color="#ffffff">中进行</font><font color="#e74f4c">,</font><font color="#ffffff">不能直接从主内存中读取</font></b>
JMM通过<b>控制主内存与每个线程本地内存之间的交互</b>,为java程序提供<b>内存可见性</b>的保证
<b><font color="#ffffff">java中</font><font color="#e74f4c">内存可见性</font><font color="#ffffff">底层的两种实现</font></b>
<font color="#e74f4c"><b>内存屏障</b></font>(synchronized,Thread.sleep(),volatile)
<b><font color="#e74f4c">cpu上下文切换</font></b>(Thread.yield(),Thread.sleep(0))
0 条评论
下一页