首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >volatile关键字的用法

volatile关键字的用法
EN

Stack Overflow用户
提问于 2014-03-19 01:26:51
回答 2查看 96关注 0票数 3

我正在读有关volatile关键字的文章,想知道下面的场景是如何解决的。

代码语言:javascript
复制
Class SomeClass
 {
  volatile int i = 10;
 }

两个线程正在尝试修改变量i。

代码语言:javascript
复制
Thread 1 does i = i + 1;
Thread 2 does i = i - 1;

操作顺序如下:

线程1将变量i读入CPU寄存器。线程切换发生在这一点上。线程2读取变量i并将其减去1,因此现在i的值是9;线程1再次调度,现在线程1是从寄存器中获取i值(即10)并将其递增到11并将其写回i,还是从原始源读取i值并将其读取为9并将其递增到10?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-03-19 01:29:55

递增/递减操作不是原子的,所以您所描述的竞争条件是完全可能的。volatile的使用并不能阻止它。您可能需要使用lockInterlocked.Increment,以确保每个操作都是原子的。

票数 8
EN

Stack Overflow用户

发布于 2014-03-19 01:36:20

正如你所写的“线程1再次被调度,现在线程1将从寄存器( 10)获取I值并将其递增到11并将其写回I,或者它将从原始源读取并将I值读取为9并将其递增至10?”- EDIT:在@Servy的帮助下:第1线程将使用值10,因为它之前已被读取以执行下一次添加操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22486653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档