volatile 保证可见性疑惑?

volatile关键字保证数据在各个CPU高速缓存中的可见性.

一个CPU改变了其缓存的值, 会立即更新主内存的值, 并使得其他CPU中的缓存失效.

这貌似是一句简单而正确的话, 我不理解其中的细节. 这句话实际上干了两件事, 一个刷新内存, 一个通知其他CPU缓存失效

我想问一下, 这个两个操作是原子操作吗?

其他CPU发现缓存失效之后, 必须从主内存中重新获取值, 那么其内部不依赖这个缓存数据的指令能否并行执行, 或者说必须先lock, 取回新值之后才能重新执行计算?

阅读 2.5k
1 个回答

我了解到的和你有点不同, java内存模型对 volatile 有特殊规定,所以才使其具有可见性。

  1. 规定了 read->load->use 的顺序一定,保证了 读的原子性
  2. 规定了 assign->store->write 的顺序一定, 保证了 写的原子性
  3. 规定了对 volatile 变量同样指令的先后顺序 和 内存屏障,保证的指定不重排
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题