我继承了一些代码,这些代码具有一组通过在单独线程上运行的串行链接捕获的实时值:
class Data
{
public static int nFooCount;
public static decimal meanValue;
// Lots more of a variety of types.
}
线程只是将数据存储到字段中,没有锁定或其他同步。对我而言,看起来像是一片混乱的海洋。所以我想为它增加一些安全性。问题是,什么是最好的?
我可以将int字段设置为volatile。但是,不能用小数类型做到这一点。联锁可以帮助解决这个问题,尽管很麻烦,使用拳击。或者我可以添加锁定对象
private static readonly object lockObj = new object();
然后访问所有内容。但这会锁定所有字段,即使它一次只修改一个字段。我无法锁定原语,无论如何这都是糟糕的形式,为每个字段添加一个锁定对象看起来会很浪费。那么有更好的方法吗?
答案 0 :(得分:3)
您可以使用ReaderWriterLockSlim
根据所需的访问级别进行锁定。你可以把它们变成一个属性来做得更好:
public int Something
{
get {
locker.EnterReadLock();
try {
return something;
} finally {
locker.ExitReadLock();
}
}
set {
locker.EnterWriteLock();
try {
something = value;
} finally {
locker.ExitWriteLock();
}
}
}
这允许多次读取和单次写入。