博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
volatile关键字 初探
阅读量:4041 次
发布时间:2019-05-24

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

volatile关键字试图阻止过度优化,volatile基本可以做到两件事情:

1. 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。

2. 阻止编译器调整操作 volatile变量的指令顺序。

 

为什么要这么做,这么做有什么目的?

我们先看2个例子,也是有关多线程安全的

例1:

x = 0Thread1              Thread2lock();              lock();x++;                 x++;unlock();            unlock();

        表面上看,因为有lock的保护,x的最终结果应该是2,这也是大部分执行的场景下的结果。但是,深入挖掘这个过程,其实并没有那么理想。编译器为了提高速度,把x放到某个寄存器里,执行完x++后,有时候暂时不更新寄存器。导致结果可能为1.

例2:

x = y = 0;Thread1        Thread2x = 1;         y = 1;r1 = y;        r2 = x

       表面上看,r1 和 r2至少应该有一个为1,实际上r1 = r2 = 0的情况,会有发生。在执行程序的时候,由于cpu动态调度,为了提高效率有可能会交换指令顺序。同样,编译器在优化时候,也可能为了效率而交换毫不相干的两条相邻指令。

导致执行时:

x = y = 0;Thread1       Thread2r1 = y;       y = 1;x = 1;        r2 = x

注:volatile 可以完美解决例1的问题,但是volatile不能完全解决例2问题,只能阻止编译器调整顺序,无法阻止cpu动态调度换序。

转载地址:http://ulldi.baihongyu.com/

你可能感兴趣的文章
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>