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