千家信息网

如何分析Volatile变量

发表于:2024-09-30 作者:千家信息网编辑
千家信息网最后更新 2024年09月30日,今天就跟大家聊聊有关如何分析Volatile变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在程序设计中,尤其是在C语言、C++、C#和Ja
千家信息网最后更新 2024年09月30日如何分析Volatile变量

今天就跟大家聊聊有关如何分析Volatile变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性。通常,volatile关键字用来阻止(伪)编译器对那些它认为变量的值不能"被代码本身"改变的代码上执行任何优化。 在C环境中,volatile关键字的真实定义和适用范围经常被误解,加之C++、C#和Java都从C中神秘地"继承"了volatile,在这些编程语言中,因此这些语言中volatile的用法和语义大相径庭。

Java也支持volatile关键字,但它被用于其他不同的用途。当volatile用于一个作用域时,Java保证如下:

1.(适用于Java所有版本)读和写一个volatile变量有全局的排序。也就是说每个线程访问一个volatile作用域时会在继续执行之前读取它的当前值,而不是(可能)使用一个缓存的值,直接从主存中读取,避免编译器优化。(但是并不保证经常读写volatile作用域时读和写的相对顺序,也就是说通常这并不是有用的线程构建)。

2.(适用于Java5及其之后的版本)volatile的读和写建立了一个happens-before关系,类似于申请和释放一个互斥锁。

这时,联想到的另一个关键词便是synchronized.可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。

因此,两个关键词的区别如下:

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。

3.volatile仅能实现变量的修改可见性,并能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。

4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

看完上述内容,你们对如何分析Volatile变量有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

变量 线程 代码 关键 关键字 编译器 语言 保证 编译 作用 内容 对象 方法 阻塞 分析 两个 主存 也就是 也就是说 关键词 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器安全组改了要重启 网络安全应急服务支撑单位条件 rfid门禁系统软件开发 广东社交软件开发方案 网络安全维护调试用户评价 广西教育网络安全攻防实战演练 廊坊银丹互联网科技有限公司 软件开发服务费比例 北京金网五矿网络技术有限公司 获取oracle数据库默认时间 公司网络安全活动周方案 15年成立的互联网科技公司 网络安全党课结尾 注册表里删除数据库 国际天气预报软件开发 王者服务器关闭怎么算输赢 杭州旅宝网络技术 序列对比和数据库搜索的区别 ftp数据库传输失败 大厅效果图软件开发 北京易诚互动网络技术有限公司 管家婆恢复账套后数据库升级 如何删除Vf数据库 互联网科技饮水杯创新 奥丁神叛服务器满了 剑灵各区服务器地址 包河区网络技术服务怎么样 蚂蚁科技和互联网 扎根互联网保险科技有限公司 东乌旗网络安全
0