ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java的JMM理解

2022-05-29 10:33:22  阅读:174  来源: 互联网

标签:volatile Java 变量 可见 理解 线程 JMM 操作 读取


1. JMM的可见性: 

  JMM的可见性时指,当一个线程频繁读取某一个变量的时候,会把该变量的值从主存缓存到自己的工作内存中,那么该线程在后续读取的过程中,就直接从自己的工作内存中读取即可,不会从主存中就进行读取,当其他线程对主存中的值进行修改时,这个线程时发现不了的,这就是可见性问题,可以使用volatile关键字来防止这种问题,当变量加了volatile修饰之后,每次其他线程读取变量的值的时候,就会从主存中读取

2. JMM的有序性:

  CPU为了提高执行效率,会对一些线程的指令进行重排序,从而达到指令交错执行,提高多线程执行效率,这样也会引发一系列的安全问题,也可以为变量加上volatile关键字来阻止指令重排,原理是被volatile修饰的变量会在变量读写操作时分别加上读屏障和写屏障(屏障是和读写操作挨着的),读屏障就是,不会让该变量后边的操作重排到读屏障的前面去,写屏障就是不会让该变量前面的操作重排到写屏障的后面去,这样就阻止了指令重排的问题

3.Happens Before规则

  1) 线程执行start前的操作对线程是可见的

  2) synchronized中的执行的操作,对后续线程是可见的

  3) 打断线程前执行的操作,对调用isInterrupted()后是可见的

  4) 传递性: 如果a操作 对 b操作可见 b操作 对 c操作可见 那么a操作 对 c操作时可见的

  5) 线程结束前的操作,对感知到它结束的线程时可见的 比如调用(isAlive or join)方法

  6) 对volatile变量的操作,对接下来其他线程是可见的

标签:volatile,Java,变量,可见,理解,线程,JMM,操作,读取
来源: https://www.cnblogs.com/arnold-ygq/p/16323279.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有