Java:没有 'synchronized'的内存同步什么时候发生?

标签 java synchronization

对于具有同步方法的类,我们知道当线程进入此类方法时,它会使用主内存中的对象状态更新其缓存,而当它离开此类方法时,它会写入其缓存主内存中对象状态的更改。

但是,在没有synchronized方法的情况下,线程是否会进入主内存来获取该对象的状态(当然第一次除外),或者将更改后的状态写回内存?如果是,在什么条件下?

我想到的一个明显的想法是,当缓存“满”且脏时,线程必须在读取更多数据之前将其刷新到主内存,或者如果缓存无效,则必须丢弃它并从主存中获取最新数据。它是否正确?是否还有其他条件会发生这种“自动”内存同步?

最佳答案

在传统的操作系统(linux、windows)中,线程经常被中断并推迟处理器,以让其他线程运行。当发生这样的线程切换时,处理器缓存也会被清除。

另一种情况是 volatile 变量,它们根本不被缓存。

关于Java:没有 'synchronized'的内存同步什么时候发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338197/

相关文章:

java - 在 Eclipse 中,Junit 不会从 src/test/resources 文件夹中获取文件。

c# - 使用 async-await 进行数据库查询

java - 从数据库加载显示 Jlist 中的值

java - Maven依赖图

java - 在android Activity 之间传递字节数组

java - 从随机长​​生成随机双

c++ - c++ 是否存在多生产者单消费者无锁队列?

具有复杂类型定义的 Java Collections.synchronizedMap()

java - 当方法仍在 GWT 中运行时如何在 UI 上启用交互

JAVA同步块(synchronized block)在多线程环境中不起作用