我的代码适用于具有不同布局的大型数据块。布局会决定哪些部分数据是固定的,哪些数据是不固定的。一旦数据被固定在一个块中,它通常就不会再改变了。所以所有代码读取数据总是会看到相同的数据。
但是,其他服务可以在这些块中进行更改,只要它们确定没有代码会读取块的那部分。为了简化代码,包含更改的块将从一个服务发送到另一个服务,而不管块的布局如何。然后接收服务将覆盖整个块,包括未更改的数据。让我用一个例子来说明这一点:
假设我们有以下数据块:
57 | 23 | 98 | 17 | 25 | 00 | 00 | 00 | 00 | 00 |
---|
并想象前 5 个值是“固定的”。我们服务中的代码只会读取前 5 个值,而不会读取接下来的 5 个值。由于我们的架构设计,我们可以保证这一点。接下来的 5 个值实际上没有意义,所以我在表中填了零来说明这一点。
现在另一个服务确定接下来的 5 个值,将完整的块发送到我们的服务,我们只需用新数据覆盖完整的块。由于前 5 个值是“固定的”,它们保持不变,但传输和覆盖块的代码不知道块的布局,所以它唯一能做的就是覆盖整个块。这是结果:
57 | 23 | 98 | 17 | 25 | 08 | 33 | 42 | 71 | 85 |
---|
如前所述,前 5 个值没有改变,尽管它们被传输逻辑覆盖。
问题是:这是一场数据竞赛吗?如果其他线程可以同时读取数据,是否允许覆盖具有完全相同值的内存地址?