[英]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.