我的问题是在阅读 Martin Kleppmann 所著的《高负载应用程序:编程、扩展、支持》ISBN 978-5-4461-0512-0 的书时出现的,我在第 383 页遇到了一个我不清楚的点。图 9.4
在本页的前半部分,作者讨论了阴影矩形,并表示该操作是非线性的。我不明白为什么?
直到第383页,作者解释了术语“线性化操作”的含义。他通过给出时间上重叠的读写操作的示例来解释这一点:
- 写操作收到成功确认后,从那一刻起,所有读操作都会收到一个新的
- 作者还提到,在写操作期间,有一个时刻,旧值被自动更改为新值,并且发起写操作的客户端尚未收到确认,而有读请求的客户端已经收到了新值
回到第383页的图9.4,我不明白这一点,为什么作者特别关注客户B?毕竟,在此之前,有一个时刻,客户端 C 使用 操作将 2 更改为 4 cas(x,2,4)
,导致客户端 A 读取了新值 4。客户端 A 和客户端 B 一样,也是竞争执行的!为什么作者不说客户端A,却说客户端B,和客户端A一样的情况,突然说他的读操作是非线性的。
作者的话“在没有其他查询的情况下,如果 read B 返回 2 就好了”完全令人困惑!为什么好呢?