博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程角度的内存模型和volatile型变量
阅读量:5738 次
发布时间:2019-06-18

本文共 926 字,大约阅读时间需要 3 分钟。

内存模型的目标是定义程序中各个变量的访问 规则,即在虚拟机中将变量(包括实例字段,静态字段和构成数组对象的元素,不包括局部变量与方法参数,因为后者是线程私有的)存储到内存和从内存中取出变量这样的底层细节。

Java内存模型规定所有的变量都存储在主内存,每条线程还有自己的工作内存,工作内存保存了被该线程使用到的变量和主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存的变量,不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存来完成。

 

关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制。

两种特性:

一.保证此变量对所有线程的可见性(指一条线程修改了这个变量的值,新值对于其他线程是可以立即得知的)

但volatile变量的运算在并发下一样是不安全的,原因是Java里的运算并非原子操作,即便如自增运算i++,也是由4条字节码指令构成。

在不符合下面场景下,仍要通过加锁(使用synchronized或java.util.concurrent中的原子类)来保证原子性。

1.运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值

2.变量不需要与其他状态变量共同参与不变约束

 

二.禁止指令重排序优化,普通变量仅仅保证在该方法的执行过程中,所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值的操作顺序与程序代码中的顺序一致,这是“线程内表现为串行的语义”(如int A=1 int B=A int C = 1,B依赖于A的值,所以它只能在A赋值之后运行,但C不依赖于其他变量,所以它在A赋值前或者B赋值前后运行都是可以的)

 

如果应用场景需要一个更大范围的原子性保证,内存模型 提供lock和unlock操作来满足这种需求,尽管虚拟机未把lock和unlock操作直接开放给用户使用,但却提供了更高层次的字节码指令monitorenter和monitorexit来隐式地使用这两个操作,对应到Java代码就是同步块,synchronized关键字。

转载于:https://www.cnblogs.com/13jhzeng/p/5873696.html

你可能感兴趣的文章
搞定接口,网络入了门
查看>>
1.Windows Server -- DNS老化时间和清理
查看>>
spring security动态配置url权限
查看>>
ubuntu安装chrome及firefox
查看>>
spring security oauth2 password授权模式
查看>>
7.29作业
查看>>
微信协议交换、消息收发
查看>>
决心书
查看>>
高性能RPC框架——Dubbo一站式快速入门
查看>>
JMS 之 Active MQ 消息存储
查看>>
设置Android之虚拟机访问tomcat服务器资源
查看>>
计算机概类
查看>>
延禧攻略邀您领取66
查看>>
zabbix批量监控URL
查看>>
python一键去抖音视频水印工具,请勿用于学习以外的用途!
查看>>
JEECG 上传插件升级-代码生成器
查看>>
CentOS7修改网卡名称为eth开头
查看>>
maven+eclipse complier Dynamic Web Module 3.0 requires Java 1.6 or newer.
查看>>
eyoucms目录结构
查看>>
网络公司易优专员介绍几种SEO工具
查看>>