在Terracotta中使用“脏读”是否安全?

时间:2008-09-26 18:20:38

标签: java cluster-computing terracotta

“脏读”,意思是读取对象的值,即使它被另一个线程写入锁定,在{Terracotta'的网站上described,但我听说它们不应该被使用,即使你在弄脏读取锁定的对象时,不关心是否可能获得旧数据。

有没有人有任何在Terracotta中使用脏读的经验,如果你不关心阅读旧值的可能性,它们是否可以安全使用?

2 个答案:

答案 0 :(得分:3)

脏读是脏读。正在分发/集群的Terracotta只增加了读取您正在访问的共享可变状态的较旧值而无需正确同步的可能性。

您应该注意,在Java 5中的内存模型下,如果不使用正确的同步,则无法保证永远读取更新的值。兵马俑可能决定利用这种可能性。事实上,任何JVM都可以在闲暇时利用它。即使它可能在您的机器上运行,它也可能在其他机器上中断。它可能会在JVM的次要更新时中断,并且可能会因为不同CPU上相同版本的JVM而中断。

考虑到这一点,您可以说脏读取在任何JVM中都不安全......除非您不介意您无法读取其他线程所做的更新 - 不太可能的情况,但它可能发生。

此外,当您实际关注Terracottas wiki的链接时,它表示该文章已被删除,并且不鼓励使用该模式。

答案 1 :(得分:1)

我是兵马俑的开发者。答案的要点就像Christian Vest Hansen已经注意到的那样 - 就像JVM不能保证在没有正确同步的情况下访问的共享对象的更新的可见性一样,Terracotta同样不能保证脏读的集群对象。

该链接确实已故意删除,并替换为不使用此模式的警告。