【问题标题】:java volatile performance issue [duplicate]java不稳定的性能问题[重复]
【发布时间】:2011-12-20 21:08:15
【问题描述】:

可能重复:
Is volatile expensive?

我听说在多线程应用程序中使用 volatile 变量会带来一些性能问题。

有人解释原因吗?

【问题讨论】:

  • 好吧,你需要volatile(和/或sync和/或...),否则你不需要。为什么还有关于“性能”的问题? (是的,同步/可见性保证会增加一些开销。)
  • 禁止重新排序,不能缓存,因为它应该从主内存中读取(以确保可见性)

标签: java volatile


【解决方案1】:

将变量声明为volatile 会导致JIT 编译器在每次使用变量时使用从内存读取/写入内存的指令。在后一种情况下,必须将高速缓存行刷新到主内存,以便其他处理器立即看到更改。读/写内存周期到执行时间。

相比之下,如果您不将变量声明为易失性,JIT 编译器可能会发出指令以从寄存器或一级或二级内存缓存读取/写入变量的状态。平均而言,这将为每次读取或写入节省几个时钟周期。

如需更详细的处理,请阅读Is volatile expensive? 的答案。

【讨论】:

  • 由线程更新的同步对象(非易失性)在退出同步块之前保留在线程的内存中。但是声明为 volatile 的变量或对象直接写入主存。那么当volatile变量被线程更新时,直接写入主存会不会很贵呢?我说的对吗?
  • 是的,它很贵。 >>更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2014-11-08
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多