Java内存模型有一些让我烦恼的东西(如果我什至正确理解了所有内容)。如果有两个线程 A 和 B,则不能保证 B 会看到 A 写入的值,除非 A 和 B 在同一个监视器上同步。
对于任何保证线程间缓存一致性的系统架构,都没有问题。但是如果架构在硬件上不支持缓存一致性,这实质上意味着每当一个线程进入一个监视器,之前所做的所有内存更改都必须提交到主内存,并且缓存必须失效。它必须是整个数据缓存,而不仅仅是几行,因为监视器没有信息它保护内存中的哪些变量。但这肯定会影响任何需要频繁同步的应用程序的性能(尤其是诸如具有短运行作业的作业队列之类的东西)。那么,Java 能否在没有硬件缓存一致性的架构上运行得相当好呢?如果不是,为什么内存模型不对可见性做出更强有力的保证?如果该语言需要监视器所保护的信息,那不是更有效吗?
正如我所看到的,内存模型为我们提供了两全其美的条件,即绝对需要同步,即使在硬件中保证了缓存一致性,另一方面,在不连贯的架构上性能不佳(完全缓存刷新)。那么它不应该更严格(需要由监视器保护的信息)还是更多地丢失并将潜在平台限制为缓存一致的架构?
就目前而言,这对我来说没有太大意义。有人可以弄清楚为什么选择这种特定的内存模型吗?
编辑:回想起来,我使用严格和失败是一个糟糕的选择。我用“严格”表示保证较少的情况,而“失败”表示相反的情况。为了避免混淆,最好用更强或更弱的保证来说话。