对于具有同步方法的类,我们知道当线程进入此类方法时,它会使用主内存中的对象状态更新其缓存,而当它离开此类方法时,它会写入其缓存主内存中对象状态的更改。
但是,在没有synchronized
方法的情况下,线程是否会进入主内存来获取该对象的状态(当然第一次除外),或者将更改后的状态写回内存?如果是,在什么条件下?
我想到的一个明显的想法是,当缓存“满”且脏时,线程必须在读取更多数据之前将其刷新到主内存,或者如果缓存无效,则必须丢弃它并从主存中获取最新数据。它是否正确?是否还有其他条件会发生这种“自动”内存同步?
最佳答案
在传统的操作系统(linux、windows)中,线程经常被中断并推迟处理器,以让其他线程运行。当发生这样的线程切换时,处理器缓存也会被清除。
另一种情况是 volatile 变量,它们根本不被缓存。
关于Java:没有 'synchronized'的内存同步什么时候发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338197/