繁体   English   中英

为什么Java中的同步保留了由多个线程更新的状态的可见性

[英]Why synchronization in Java preserves visibility of states being updated by multiple threads

我知道同步可以用于强制由多个线程更新的变量可见性。 即假设我们有两个线程共享的变量。 如果我们在一个线程中对其进行更新,则除非我们正确同步对该变量的访问,否则不能保证另一个线程看到新更新的值。

但是我想知道幕后到底是什么导致了这一点。 有人可以让我知道吗?

非常感谢。

还有许多其他方法来确保可见性,例如易失性,有序/惰性集。

当您输入同步块时,它将执行读取屏障。 这意味着所有读取将保持一致。 退出同步块时,它将执行写屏障。 这样可以确保所有写入均保持一致的顺序。 具体执行方式由CPU确定,但对于x86 / x64,它是单个机器代码指令或前缀。

在多处理器CPU上会发生此问题。 如果变量不是非易失性的,则JIT编译器将优化其使用,以分别保存在高速缓存中或每个cpu内核的寄存器中。 在其他内核上同时运行的线程将不会看到对该变量的更改,除非将其保存到RAM或刷新缓存。

如果您写入易失性变量或其他同步,则将立即刷新所有CPU缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM