.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指令. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 详解Spring Boot中使用Flyway来管理数据库版本
- 使用GSON库转换Java对象为JSON对象的进阶实例详解
- java – 在不同线程中的类之间传递对象的最佳方法?
- java – 如何正确使用JTI声明JWT以防止重放攻击?
- Java内存缓存工具Guava LoadingCache使用解析
- java – ThreadLocal是否优于HttpServletRequest.setAttrib
- java – 使用基类实例在派生类中访问的受保护成员
- JSP与Servlet的介绍说明
- java – 为什么我不能.invokeExact()在这里,即使MethodType
- java.lang.Class和相等
