【发布时间】:2020-12-07 16:03:48
【问题描述】:
在名为 What is this thing you call "thread safe"? 的帖子中,Eric Lippert 说:
不可变数据结构的线程安全就是确保所有操作中数据的使用在逻辑上是一致的,但代价是您正在查看可能已过时的不可变快照。
我认为不可变数据结构的全部意义在于它们不会改变,因此不会过时,因此它们本质上是线程安全的
Lippert 在这里是什么意思?
【问题讨论】:
-
印刷报纸是不可变的。印刷报纸会过时吗?
-
公平点,但在文章中,Lippert 专门讨论了线程安全。他可能会说“不可变的数据结构是不可变的,因此它们是线程安全的”,但他却说“确保所有操作中数据的使用在逻辑上是一致的”,这听起来好像还有更多需要注意的地方关于那个简单的不变性。
-
Eric L. 不只是说“不可变”,他说“不可变快照”。这意味着有一些数据结构可以随时更改,并且不可变的“快照”是该数据结构状态的冻结副本,就像在最近的某个时刻一样。当一个线程查看“快照”并根据其内容做出决定时,其他线程可能正在更新“实时”副本。
-
如果原始数据结构是不可变的,那么就不需要“快照”。您引用的那篇文章清楚地说,“快照”。
-
@NathanHughes:谢谢分享;我以前没见过。嵌入在不断变化的世界中的不可变数据结构上的纯函数正是 IDE 所处的情况,我们在设计异步工作流时考虑了该文档中提出的许多想法。但要让它们更实用,还有很多工作要做。
标签: multithreading thread-safety immutability