微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net – 多线程和布尔值

我有一个包含像这样的布尔字段的类:
public class MyClass
{
    private bool boolVal;
    public bool BoolVal
    {
        get { return boolVal; }
        set { boolVal = value; }
    }
}

可以使用该属性从许多线程读取和写入该字段.我的问题是我是否应该使用锁定语句来阻止getter和setter?或者我应该只使用volatile关键字并保存锁定?或者我应该完全忽略多线程,因为获取和设置布尔值原子?

问候,

解决方法

这里有几个问题.

简单第一.是的,读取和写入布尔变量是一种原子操作. (澄清:我的意思是读写操作本身就是布尔值的原子操作,而不是读写操作,当然会生成两个操作,这些操作一起不会是原子的)

但是,除非您采取额外的步骤,否则编译器可能会优化此类读取和写入操作,或者移动操作,这可能会使您的代码与您的操作不同.

将字段标记为volatile意味着操作不会被优化掉,该指令基本上表示编译器不应该假设此字段中的值与前一个字段相同,即使它只是在前一条指令中读取它.

但是,在多核和多cpu计算机上,不同的核心和cpu可能在其缓存中具有不同的字段值,因此您添加一个lock {}子句或任何其他强制内存障碍的子句.这将确保字段值在核心之间保持一致.此外,读取和写入不会超出代码中的内存障碍,这意味着您可以预测操作发生的位置.

因此,如果您怀疑或知道该字段将被写入多个线程并从多个线程读取,我肯定会添加锁定和易失性.

请注意,我不是多线程的专家,我能够拥有自己的,但我通常会在防守方面进行编程.可能(我认为很有可能)你可以实现一些不使用锁的东西(有许多无锁构造),但遗憾的是我在这主题中没有足够的经验来处理这些事情.因此我的建议是添加一个lock子句和一个volatile指令.

原文地址:https://www.jb51.cc/java/129379.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐