在Terracotta中可以安全使用"脏读"吗?

时间:2020-03-06 14:47:54  来源:igfitidea点击:

Terracotta网站上描述了"脏读",即即使对象被另一个线程写锁定,也要读取它的值,但我听说即使我们不关心它们的可能性也不应使用它们脏读锁定对象时可能会得到旧数据。

有没有人有在Terracotta中使用脏读的经验,如果我们不关心读取旧值的可能性,他们是否可以安全使用?

解决方案

脏读是脏读。分散/群集的Terracotta仅增加了在没有适当同步的情况下读取访问的共享可变状态的旧值的可能性。

我们应该注意,在Java 5的内存模型下,如果不使用适当的同步,就不能保证读取更新后的值。兵马俑可能决定利用这种可能性。实际上,任何JVM都可以随意使用它。即使它可能在计算机上运行,​​也可能在其他计算机上损坏。它可能在JVM的次要更新时中断,并且可能在不同CPU上针对同一JVM的相同版本而中断。

考虑到这一点,我们可以说脏读取在任何JVM中都是不安全的...除非我们不介意我们永远无法读取其他线程造成的不太可能发生的更新,可能会发生。

此外,当我们实际访问Terracottas Wiki的链接时,它表示该文章已被删除,并且不建议使用该模式。

我是Terracotta开发人员。正如克里斯蒂安·韦斯特·汉森(Christian Vest Hansen)所指出的那样,答案的要点是,就像JVM不保证没有适当同步访问的共享对象的更新的可见性一样,Terracotta同样不能保证对集群的脏读。目的。

确实确实有意删除了该链接,并用警告代替该链接以不使用此模式。