首页 / C# / c# – 这个示例线程是否安全?
c# – 这个示例线程是否安全?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 这个示例线程是否安全?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1089字,纯文字阅读大概需要2分钟。
内容图文
![c# – 这个示例线程是否安全?](/upload/InfoBanner/zyjiaocheng/760/46502ea957234bc39b240f7cca89410c.jpg)
假设我有一个充当数据缓存的单例类.多个线程将从缓存中读取,并且单个线程将定期刷新它.它看起来像这样:
public sealed class DataStore
{
public static DataStore Instance { get { return _instance; } }
public Dictionary<Foo, Bar> FooBar { get; private set; }
static DataStore() { }
private DataStore() { }
public void Refresh() {
FooBar = GetFooBarFromDB();
}
private static readonly DataStore _instance = new DataStore();
}
我的问题基本上是,当其他线程可能正在访问FooBar时,Refresh()是否安全?我需要使用锁,还是我的获取和设置操作是原子的?我是否需要显式声明volatile字段来备份我的属性?
P.S.,如果有人能想到这个问题的更具描述性的标题,我很乐意欢迎它.
编辑:修复了我的例子来明显纠正非原子代码.
解决方法:
是的,在这种情况下你需要显式同步,因为另一个线程可以获得FooBar并在你完成写入之前开始阅读它.
但是,如果你这样做,
public void Refresh() {
var tmp = new Dictionary<Foo, Bar>();
// Fill out FooBar from DB
FooBar = tmp;
}
那么你就不需要添加显式同步,因为从一个引用到另一个引用的切换是原子的.
当然,这里隐含的假设是在Refresh方法之外没有写入.
编辑:您还应该从自动实现的属性切换到手动实现的属性,其中支持变量使用volatile修饰符声明.
内容总结
以上是互联网集市为您收集整理的c# – 这个示例线程是否安全?全部内容,希望文章能够帮你解决c# – 这个示例线程是否安全?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。