【发布时间】:2010-06-16 14:33:37
【问题描述】:
Java 内存模型让我有些不解(如果我什至正确理解所有内容)。如果有两个线程 A 和 B,则无法保证 B 会看到 A 写入的值,除非 A 和 B 在同一监视器上同步。
对于任何保证线程间缓存一致性的系统架构,都没有问题。但是如果架构在硬件上不支持缓存一致性,这实质上意味着每当一个线程进入一个监视器,之前所做的所有内存更改都必须提交到主内存,并且缓存必须失效。它需要是整个数据缓存,而不仅仅是几行,因为监视器没有信息它保护内存中的哪些变量。 但这肯定会影响任何需要频繁同步的应用程序的性能(尤其是诸如具有短运行作业的作业队列之类的东西)。那么,Java 能否在没有硬件缓存一致性的架构上运行得相当好呢?如果不是,为什么内存模型不对可见性做出更强有力的保证?如果该语言需要由监视器保护的信息,那不是更有效吗?
在我看来,内存模型为我们提供了两全其美的条件,即绝对需要同步,即使在硬件中保证缓存一致性,另一方面在不连贯的架构上性能不佳(完全缓存刷新)。那么它不应该更严格(需要由监视器保护的信息)还是更多地丢失并将潜在平台限制为缓存一致的架构?
就目前而言,这对我来说没有太大意义。有人能解释一下为什么选择这个特定的内存模型吗?
编辑:回想起来,我使用严格和失败是一个糟糕的选择。我用“严格”表示保证较少的情况,而“失败”表示相反的情况。为避免混淆,最好用更强或更弱的保证来说话。
【问题讨论】:
-
有一点需要说明的是“在同一台显示器上同步”这句话。据我了解,同一监视器上的同步保证了该监视器周围的执行顺序。但是,就内存缓存而言,获取 any 同步块会强制缓存重新加载,而释放 any 锁会强制刷新工作 CPU 内存中的所有写入。
-
您想到了哪个特定的拱门?
标签: java multithreading synchronization memory-model cpu-cache