volatile
关键字在什么情况下使用?更重要的是:程序如何从中受益?
根据我所读和已知的,volatile
应该用于被不同线程访问的变量,因为它们比非volatile
的变量读取速度稍快。如果是这样,难道就没有强制使用相反的关键字吗?
或者它们实际上在所有线程之间进行了同步吗?普通变量为什么不行?
我有很多多线程代码,我想稍微优化一下。当然,我不希望有巨大的性能提升(目前我没有任何问题),但我一直在努力使我的代码更好。我对这个关键字有点困惑。
volatile
关键字在什么情况下使用?更重要的是:程序如何从中受益?
根据我所读和已知的,volatile
应该用于被不同线程访问的变量,因为它们比非volatile
的变量读取速度稍快。如果是这样,难道就没有强制使用相反的关键字吗?
或者它们实际上在所有线程之间进行了同步吗?普通变量为什么不行?
我有很多多线程代码,我想稍微优化一下。当然,我不希望有巨大的性能提升(目前我没有任何问题),但我一直在努力使我的代码更好。我对这个关键字有点困惑。
volatile
的共享变量,这些线程会创建该变量的本地副本,并在本地副本上进行操作。因此,变量的更改不会反映出来。这样做是因为缓存访问比从主内存访问变量快得多。volatile
时,它告诉程序不要创建任何变量的本地副本,直接从主内存中使用变量。volatile
,我们告诉系统它的值可能会意外地从任何地方改变,因此始终使用保存在主内存中的值,并且始终在主内存中更改变量的值,而不创建任何变量的本地副本。volatile
不能替代同步,并且当一个字段被声明为volatile
时,编译器和运行时会注意到该变量是共享的,对它的操作不应与其他内存操作重新排序。volatile
变量不会被缓存在寄存器或缓存中,因此读取volatile
变量总是返回任何线程最近写入的值。volatile
,也没有遇到变量不及时更新的问题,所以我不太明白你所说的 变量的更改没有反映出来
。那么,volatile
变量实际上会慢一些,但对于多线程来说仍然更快? - AyCesynchronized
(这是我主要做的事情),那么它们会从volatile
中受益吗?还是这是针对未明确锁定的变量的? - AyCevolatile
关键字意味着每次引用变量时,编译器都会强制读取新值。当该变量是标准内存之外的东西时,这很有用。例如,在嵌入式系统中,您正在读取一个硬件寄存器或接口,它对处理器而言就像一个内存位置。如果处理器使用先前读取的缓存值,则更改该寄存器值的外部系统更改将无法正确读取。使用volatile
强制重新读取并保持所有内容同步。
volatile
看起来并没有真正做任何 VM 本身无法完成的事情。但是,例如访问变量时,它会提高速度吗? - AyCevolatile
只是一个“提示”,对吗?当当前代码太慢时可以考虑使用它?我仍然不确定应该声明哪些变量为volatile
。你说的“这通常是不好的!”是什么意思? - AyCevolatile
关注内存可见性。在对volatile
变量进行写操作后,该变量的值对所有读取者都变得可见。有点像关闭缓存。
这里是一个好的堆栈溢出响应: 你是否曾经在Java中使用过volatile关键字?
关于具体问题,它们没有被同步。您仍然需要使用锁定来完成。普通变量既不同步也不易失。
为了优化线程化代码,最好阅读粒度、乐观和悲观锁定方面的知识。
volatile
只是承诺做虚拟机已经完成的事情。你链接帖子中第一个答案中的示例,我会使用 synchronized
来实现 - 在我看来更加简洁。 - AyCesynchronized
和volatile
的示例,可以在此处查看它们的应用:http://en.wikipedia.org/wiki/Double-checked_locking。 - lalalandsynchronized
,但我没有预料到它会那么昂贵! - AyCe