架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13271|回复: 0

[控制台程序] .net/C# 中的volatile关键字学习理解

[复制链接]
发表于 2018-5-23 11:23:40 | 显示全部楼层 |阅读模式
ms链接:https://docs.microsoft.com/zh-cn ... e/keywords/volatile

volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。

volatile 修饰符通常用于由多个线程访问、但不使用 lock 语句对访问进行序列化的字段。

volatile 关键字可应用于以下类型的字段:

  • 引用类型。
  • 指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。 换句话说,不能声明“指向可变对象的指针”。
  • 类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
  • 具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。
  • 已知为引用类型的泛型类型参数。
  • IntPtr 和 UIntPtr。


可变关键字仅可应用于类或结构的字段。 不能将局部变量声明为 volatile


不废话了,写个循环测试一下:

我们先循环1万次测试一下,发现输出的a值结果都正确的,但是,并不能说明volatile是线程安全的,因为,你测试多次就会发现会出现计算错误!因为这是有几率出现正确结果,也有几率出现错误结果

QQ截图20180523111215.jpg

代码:



我们再来测试10万次循环,可以发现a的值就不正确了,因为循环的次数越小,出错的几率就越小,错误不是那么明显,就像刚才循环了1万次就没有出现错误一样。

这时,我们加上lock锁试下,可见和我们的预期一样,a的值计算正确。

QQ截图20180523111250.jpg QQ截图20180523111401.jpg

代码:



总结:volatile并不保证线程安全,上面例子可以看到。




上一篇:抓包工具smsniff 2.0汉化版下载
下一篇:VS远程调试"调试操作花费的时间比预期要长"解决方案
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 08:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表