我知道问题的答案可能很明显.但如果有人能给我一个明确的答案,那将会有所帮助.
问题是:java NIO包是否可以提供一些内存一致性保证?
场景是:
Thread A Thread B
[modify Object X]
[Send a request A over TCP by NIO]
[receive response for request A over TCP by NIO]
[read Object X]
Run Code Online (Sandbox Code Playgroud)
如果应用程序在线程A和线程B之间没有任何同步/安全引用脉冲,则线程A进行的修改是否对线程B可见.
非常感谢你的帮助.
我的猜测是TCP请求不对线程同步做出任何正式保证.
也就是说,我认为对于您提出的问题有一个简单的解决方案:假设TCP请求至少与获取锁定一样昂贵(按性价比)是合理的.因此,您可以将发送/接收封装在同步块中,而不会显着降低性能.这将确保线程B在修改后看到对象X.
对于这种情况,JMM 绝对不做任何保证.除非两个线程在同一个对象上同步,否则两个线程之间没有"事先发生"保证.因此,即使你可以证明A中X的变化实际上是在按时间顺序读取B之前发生的,但是不能保证B会看到所做的更改是A在同一个对象上没有同步.
CPU缓存在这里发挥作用; B可能很好地看到X中的陈旧值,因为缓存尚未写回主存储器(尚未).
您的代码可能适用于某些硬件配置,偶尔也会失败.具有松散内存模型的SMP系统特别容易失败(想想DEC Alpha).