java多线程之内存可见性资料.docx
- 文档编号:18099450
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:9
- 大小:3.31MB
java多线程之内存可见性资料.docx
《java多线程之内存可见性资料.docx》由会员分享,可在线阅读,更多相关《java多线程之内存可见性资料.docx(9页珍藏版)》请在冰点文库上搜索。
java多线程之内存可见性资料
Java多线程之内存可见性
1.可见性介绍
Java内存模型描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。
1.1两条规定
1.2共享变量可见性实现的原理
2.synchronized实现可见性
2.1synchronized实现可见性
2.2重排序
经过重排序后,代码可能会变成如下所示的情况。
2.3as-if-serial
注意:
有数据依赖关系的行是禁止进行重排序的,如上的sum=num1+num2,这是禁止进行重排序的。
虽然如此,但是在多线程中代码重排序之后会出现很多问题,及变量的先后顺序执行会影响执行结果。
3.举例分析
对于这一段代码而言,若不加任何修饰,现在有两个线程来访问,一个是读线程,执行read()代码;一个是写线程,执行write()代码。
1.若执行顺序如上述所言,写线程执行1.1后,假如将自己工作内存中的数据同步到主内存中,读线程执行2.1后,会读取主内存中的修改后的ready数据,然后执行2.2和2.3后,会打印result=3
2.若执行顺序如上所述,result会打印result=0
3.当然2.1和2.2也可以进行重排序的,因为没有数据依赖关系,只不过重排序之后如下所示。
为什么会出现上述的几种顺序呢?
因为编译器会对代码进行重排序,所以会出现多种情况,但是有依赖关系的行不会进行重排序。
3.1可见性分析
3.2synchronized解决方案
安全代码:
加一个synchronized即可。
关于第3点,可以看第二章节讲解。
4.volatile实现可见性
4.1volatile能够保证可见性
1,这里的可见性是指在主内存中可见。
2,比如num++这类符合操作。
1,java中一共有8条类似的指令,这里只是其中的两条。
4.2举例分析
可见同目录下面的Example下面的volatileDemo.java。
5.synchronized和volatile的比较
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 多线程 之内 可见 资料