了解ReaderWriterLockSlim
。试着理解为什么ReaderWriterLockSlim
优于任何其他锁,例如Monitor
?
EnterWriteLock()
和EnterReadLock()
之间有什么区别。我认为EnterWriteLock()
比EnterReadLock()
有更多机会获得锁定。但我想我可以在需要写的时候使用EnterReadLock()
- 它只会慢一点。
class Program
{
static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();
static List<int> _items = new List<int>();
static Random _random = new Random();
static void Main(string[] args)
{
new Thread(read).Start() ;
new Thread(read).Start();
new Thread(read).Start();
new Thread(()=>write("A")).Start();
new Thread(() => write("B")).Start();
}
public static void read()
{
while (true)
{
//_rw.EnterReadLock();
_rw.EnterWriteLock();
for (int i = 0; i < _items.Count; i++)
{
Thread.Sleep(1000);
}
//_rw.ExitReadLock();
_rw.ExitWriteLock();
}
}
public static void write(string value)
{
while (true)
{
int newNumber = GetRandom(100);
_rw.EnterWriteLock();
_items.Add(newNumber);
_rw.ExitWriteLock();
Console.WriteLine("ThreadID={0} added={1}",Thread.CurrentThread.ManagedThreadId,newNumber);
Thread.Sleep(100);
}
}
private static int GetRandom(int v)
{
lock (_random)
{
return _random.Next(v);
}
}
}
答案 0 :(得分:0)
他们有不同的语义。 Monitor
(lock
)允许一个帖子拥有&#34;锁定&#34;,以及 。 ReaderWriterLock[Slim]
允许任意数量的读者,或(一位作家和其他人)。
因此,如果写入很少并且读取需要花费很多时间,那么读写器设置可能会很有用,这样您就可以拥有多个并发读取器,并在需要改变数据时将所有人锁定。< / p>
&#34;更好&#34;。他们做不同的事情。他们每个人都有理想的场景,以及他们选择不好的场景。