【发布时间】:2017-09-07 23:15:19
【问题描述】:
我有一个名为 Configuration 的类,它有几个属性,这些属性将使用从数据库加载的值进行更新。
我在Configuration 构造函数中有一个数据触发事件OnDataChanged,其中事件处理程序订阅了一个私有方法。Configuration 的同一个实例被多个线程使用。
如果在数据库表中更新了某些内容,则触发 OnDataChanged 事件并调用私有方法,并在此私有方法中使用数据库中的最新数据更新 Configuration 属性,以便已经使用的线程该实例将具有更新的数据。
这是线程安全的吗?
如果不是,我们如何使这个线程安全?我没有使用任何锁。
编辑:
添加示例代码:
public class Configuration
{
private GeneralConfiguration _generalConfiguration;
private AccountConfiguration _accountConfiguration;
private readonly SqlTableDependency<Model> _dependency;
public Configuration()
{
_dependency = new SqlTableDependency<Model>("connectionstring", "dbo.Configuration");
_dependency.OnChanged += _dependency_OnChanged;
_dependency.Start();
}
private void _dependency_OnChanged(object sender, RecordChangedEventArgs<Model> e)
{
Init();
}
private Configuration Init()
{
DataAccess da = new DataAccess();
List<string> configs = da.GetConfigData();
_generalConfiguration = JsonConvert.Deserialize<GeneralConfiguration>(configs[0]);
_accountConfiguration = JsonConvert.Deserialize<AccountConfiguration>(configs[1]);
return this;
}
public GeneralConfiguration GeneralConfiguration { get { return _generalConfiguration; } }
public AccountConfiguration AccountConfiguration { get { return _accountConfiguration; } }
}
【问题讨论】:
-
请提供代码示例
-
“我没有使用任何锁。” - 这肯定给了你一个提示?
-
您打开自己的问题有多严重在某种程度上取决于您使用的数据类型。至少在某些版本的 .Net 中,并非所有变量读取/写入都是原子的,这意味着如果一个线程读取而另一个线程正在写入,则读取器可以获得一个部分是旧值和部分新值的值(double 和 long 是一个非原子引用的例子)。 Atomicity of variable references。只需实施适当的锁定即可。
标签: c# multithreading thread-safety