我查看了并发集合,但它们似乎在引擎盖下使用了普通锁定。.Net 框架中有没有使用这种锁定结构的好例子?
我最初查看的是 ConcurrentDictionary。我看到它使用的是普通锁,但 BlockingCollection 类在其内部方法中使用了 SpinWait。
我查看了并发集合,但它们似乎在引擎盖下使用了普通锁定。.Net 框架中有没有使用这种锁定结构的好例子?
我最初查看的是 ConcurrentDictionary。我看到它使用的是普通锁,但 BlockingCollection 类在其内部方法中使用了 SpinWait。
几乎任何低锁并发集合类都可能使用SpinWait
和的某种组合Yield
。虽然ConcurrentDictionary
是一个值得注意的例外。我找到的课程列表包括以下内容。
正常锁定是什么意思?某种lock(object) { ... }
构造?
如果是,你应该看看ConcurrentStack
例如,它使用 aSpinWait
来完成它的工作。
ConcurrentStack 和 ConcurrentQueue 是无锁集合,但是 ConcurrentDictionary、ConcurrentBag 使用锁。BlockingCollections 只是一个容器,所以它本身不是一个集合,它必须包装其他线程安全的集合,例如 var bc = new BlockingCollection(new ConcurrentStack());
这是一篇关于如何在无锁代码中使用 SpinWait 的介绍性文章 http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html