阅读 Bartosz Milewski 在 STM 上的精彩博客文章,我很高兴阅读以下内容:
但是要考虑一个重要的事实:STM 是非常细粒度的。例如,当您将项目插入树中时,STM 事务只会锁定您实际修改的节点。STM 将轻松击败每棵树使用一个全局锁的解决方案。
但是,据我了解,这种行为不是自动的,是吗?如果我使用 a TVar (Map k a)
,它不会充当整个地图上的单个全局锁吗?为了获得这种细粒度行为的好处,我(或某人)必须实现一个内部TMap
包含的地图替换(例如),对TVars
吗?
这似乎是一个显而易见的问题,但在阅读 STM 实现时,我对TVar
s 的读取和内存位置的读取感到困惑。我只是想确保我做对了!
Bartosz 进一步说:
由于存在死锁的风险,每个节点的手动锁定很难正确实施。
据我了解,与 STM 的区别在于,虽然 STM 实现实际上使用了手动锁定解决方案可能使用的锁,但锁的实际获取和释放是由运行时处理的,而不是程序员 - 对吗?