Java 面试宝典:什么是可见性?volatile 是如何保证可见性的?
💡
原文中文,约2700字,阅读约需7分钟。
📝
内容提要
本文讨论了多核年代中的可见性问题和解决方案,包括使用volatile修饰共享变量和同步机制。volatile通过lock前缀和MESI协议确保可见性,而MESI协议用于维护多处理器系统中的缓存共同性。内存屏障volatile通过Load和Store屏障实现可见性。最后以i++为例说明了内存屏障的作用。
🎯
关键要点
- 可见性是指一个线程对共享变量的修改能够被其他线程及时看到。
- 在多核环境中,每个CPU有自己的缓存,可能导致可见性问题。
- 解决可见性问题的方案包括使用volatile修饰共享变量和同步机制。
- volatile确保可见性,通过在写入前加lock前缀,强制将值写入主内存。
- MESI协议用于维护多处理器系统中的缓存一致性,确保缓存行的状态有效。
- MESI协议的四种状态包括Modified(修正)、Exclusive(独占)、Shared(共享)和Invalid(无效)。
- 内存屏障通过Load和Store屏障实现可见性,确保每次读写操作都能从主内存获取最新数据。
- 以i++为例,展示了内存屏障如何确保线程安全和可见性。
➡️