C# asp.net中静态变量的读/写锁定
我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原语) 它将被多个线程同时频繁地读取 我很少需要写它(与读的次数相比) 确保线程安全的最佳方法是什么,以便在我向其写入数据时,其他线程不会读取部分写入的数据 我只使用过C# asp.net中静态变量的读/写锁定,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原语) 它将被多个线程同时频繁地读取 我很少需要写它(与读的次数相比) 确保线程安全的最佳方法是什么,以便在我向其写入数据时,其他线程不会读取部分写入的数据 我只使用过锁,但我知道这会阻止并发读取:( 谢谢您可以使用读写器锁,它比锁更难使用,但它允许并发读取: 我从锁开始。无竞争的锁非常便宜。你可以使用(假设你使用的是.NET 3.5),但锁更容易找到正确的锁。如果出现问题,请对其进行优化 StraightReaderWriterL
锁
,但我知道这会阻止并发读取:(
谢谢您可以使用
读写器锁
,它比锁
更难使用,但它允许并发读取:
我从
锁开始。无竞争的锁非常便宜。你可以使用(假设你使用的是.NET 3.5),但锁更容易找到正确的锁。如果出现问题,请对其进行优化
StraightReaderWriterLock
可能比简单锁慢-它没有可能快,因此是slim版本:)
你说的“频繁”是指多久一次?你预计会有多少竞争?您可能希望对其进行建模(例如,模拟合理数量的请求)并对无锁定与简单锁定进行基准测试,以了解开销是多少
您可能可以使用无锁选项volatile
——但坦率地说,我最近放弃了这一点,因为理智的人很难推理。(这不是我想的意思。)
你到底在用这些数据做什么?该类型是不可变的类型吗?因此,一旦获得了正确的引用,就可以以线程安全的方式读取,而无需任何锁定?感谢您的帮助,我已经确定了这种方法,直到性能成为一个问题。假设这是正确的(线程安全),其中SharedResource是不可变的
public static class SharedResourceManager
{
private static readonly object syncLock = new object();
private static SharedResource res { get; set; }
public static SharedResource Resource
{
get
{
lock (syncLock)
return res;
}
set
{
lock(syncLock)
res = value;
}
}
}
好的建议-这是.NET framework中的一个奇怪之处,除非你读到它,否则你可能会做出错误的选择。@Andrew-如果你想了解更多,这里有一篇好文章-谢谢你的建议。每一个请求我都会阅读,所以只要有流量,我就会经常阅读。我想我忽略了不变性这一点。目前它不是(但可能是),所以锁定并不能真正帮助我。嗯,是时候重新考虑了。如果我把它设置为不可变的,也许我就不需要任何锁定,因为请求只需要一段时间copy@Andrew:您仍然需要锁定或使其不稳定,以避免获取过时数据。是的,这是安全的。使用易失性私有变量可能也可以。如果某个属性是私有的,那么您使用该属性作为res
的原因是什么?