【发布时间】:2010-09-13 13:19:27
【问题描述】:
“脏读”,意思是读取一个对象的值,即使它被另一个线程写锁定,在 Terracotta 的网站上是described,但我听说它们不应该被使用,即使你不'不关心在脏读锁定对象时可能会获得旧数据的可能性。
有没有人有在 Terracotta 中使用脏读的经验,如果您不关心读取旧值的可能性,使用它们是否安全?
【问题讨论】:
标签: java cluster-computing terracotta
“脏读”,意思是读取一个对象的值,即使它被另一个线程写锁定,在 Terracotta 的网站上是described,但我听说它们不应该被使用,即使你不'不关心在脏读锁定对象时可能会获得旧数据的可能性。
有没有人有在 Terracotta 中使用脏读的经验,如果您不关心读取旧值的可能性,使用它们是否安全?
【问题讨论】:
标签: java cluster-computing terracotta
脏读是脏读。 Terracotta 是分布式/集群的,它只会增加读取您在没有适当同步的情况下访问的共享可变状态的更旧值的可能性。
您应该注意,在 Java 5 中的内存模型下,如果您不使用正确的同步,则无法保证永远读取更新的值。兵马俑可能决定利用这种可能性。事实上,任何 JVM 都可以在闲暇时利用它。即使它可能在您的机器上运行,它也可能在其他机器上中断。它可能会因 JVM 的小更新而中断,并且可能会因不同 CPU 上的同一 JVM 的相同版本而中断。
考虑到这一点,您可以说脏读在任何 JVM 中都是不安全的……除非您不介意您永远无法读取其他线程所做的更新的可能性 - 一个不太可能的情况,但它可能会发生。
此外,当您实际点击您的 Terracottas wiki 链接时,它会说该文章已被删除并且不鼓励使用该模式。
【讨论】:
我是一名 Terracotta 开发人员。答案的要点正如 Christian Vest Hansen 已经指出的那样——正如 JVM 不保证在没有适当同步的情况下访问的共享对象的更新的可见性一样,Terracotta 同样不能保证对一个聚集对象。
该链接确实已被故意删除并替换为不要使用此模式的警告。
【讨论】: