- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我阅读 C# 多线程时,我对 EnterReadLock 和 EnterUpgradeableReadLock 之间的区别感到困惑在下面的代码中,是否可以将 cacheLock.EnterUpgradeableReadLock() 替换为 cacheLock.EnterReadLock()?
private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>();
public AddOrUpdateStatus AddOrUpdate(int key, string value)
{
//can there be cacheLoack.EnterReadLock?
cacheLock.EnterUpgradeableReadLock();
try
{
string result = null;
if (innerCache.TryGetValue(key, out result))
{
if (result == value)
{
return AddOrUpdateStatus.Unchanged;
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache[key] = value;
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Updated;
}
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Added;
}
}
finally
{
cacheLock.ExitUpgradeableReadLock();
}
}
最佳答案
如果要升级为写锁,则必须是可升级锁。
为什么不总是使用可升级的锁呢?缺点是什么?这:
Only one thread can enter upgradeable mode at any given time. (https://learn.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim.enterupgradeablereadlock?view=netframework-4.8)
这是您代码中的一个严重问题。因为你总是在这种模式下锁定,即使只是阅读你有效地单线程访问数据结构。实际上,它根本不再是读写锁。
我了解您的意图是在常见读取情况下允许并发,同时在写入情况下实现安全。也许最简单的解决方法是首先尝试以读取模式从缓存中读取。如果需要写入,则完全退出锁定并在可升级模式或直接在写入模式下重试。这样快速路径具有并发性。
也就是说,我想知道 ReaderWriterLockSlim
具有什么样的现实世界可扩展性。您锁定的代码区域非常便宜。锁的内部数据结构可能会发生竞争,所有可扩展性都可能被破坏。它最终可能与 Monitor
/lock
一样快或慢。
ConcurrentDictionary
旨在跨键横向扩展。这可能是要走的路。
关于c# - EnterUpgradeableReadLock 和 EnterReadLock 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55966938/
我很熟悉ReaderWriterLockSlim但尝试实现 EnterUpgradeableReadLock()最近在一个类(class)......不久之后我意识到当 2 个或更多线程运行代码时,这
当我阅读 C# 多线程时,我对 EnterReadLock 和 EnterUpgradeableReadLock 之间的区别感到困惑在下面的代码中,是否可以将 cacheLock.EnterUpgra
所以我遇到这样一种情况,我可能有很多很多读取,只是偶尔写入多个线程共享的资源。 很久以前,我阅读了关于 ReaderWriterLock 的内容,并且阅读了关于 ReaderWriterGate 的内
我是一名优秀的程序员,十分优秀!