2008-09-26 36 views
3

“脏读”意味着读取对象的值,即使它被另一个线程写入锁定,在兵马俑的网站上是described,但我听说它们不应该被使用,即使你不在乎当你肮脏地读取被锁定的对象时,你可能会得到旧数据。在“兵马俑”中使用“脏读”是否安全?

有没有人有使用兵马俑脏读的经验,如果你不关心读旧价值的可能性,他们是否安全使用?

回答

3

脏读是脏读。兵马俑,分布/集群,只增加了读取即使没有正确同步访问的共享可变状态的旧值的可能性。

您应该注意,在Java 5的内存模型下,如果您没有使用正确的同步,则无法保证有史以来会读取更新后的值。兵马俑可能会决定利用这种可能性。实际上,任何JVM都可以在闲暇时利用它。即使它可能在你的机器上工作,它也可能在其他机器上崩溃。它可能会在JVM的微小更新上中断,并且可能会在不同CPU上的同一版本的同一JVM上中断。

考虑到这一点,你可以说在任何JVM中脏读都是不安全的......除非你不介意你永远无法读取其他线程所做更新的可能性 - 一个不太可能的情况,但可能发生。另外,当你实际上按照你的链接到Terracottas wiki时,它说该文章已被删除,并且该模式不鼓励。

+0

是的,它是由于我与一位兵马俑销售工程师的交谈而被删除的。 – sanity 2008-09-27 20:28:19

1

我是一名兵马俑开发人员。答案的要点正如Christian Vest Hansen已经指出的那样 - 就像JVM不能保证无法正确同步访问的共享对象更新的可见性一样,Terracotta同样也不能保证关于聚簇对象。

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