volatile 解决了什么问题?

1,504 total views, 3 views today

volatile 关键字是最常问到的问题,关于这个关键字的作用解释,网上的文章已经多如牛毛了。

 

简短的总结一下,主要解决 2 个问题。

  • 禁止编译器优化而重排序指令。
  • 对 volatile 修饰的变量值,保证线程读取到的值是最新的,而不是寄存器中缓存的值。

 

编译器会自作主张的对代码顺序优化,尽管这种优化在大多数场合都是有效的,但是在多线程环境下可能导致不一致的问题。

 

volatile 修饰的变量,进行写操作时,这个变量将会被直接写入共享内存,而不是线程中缓存。volatile 变量读操作时,直接从共享内存中读,而不是从线程的缓存中读取,保证线程每次读到的都是最新值。也就是保证了内存可见性。

 

Java 中,long 和 double 都是 64 位的,因此在对于 32 位的操作系统,读写 long 和 double 数据类型会进行 2 次操作,先读写 32 位,再读写 32 位。在多线程情况下,可能读写到一半,这个数值就被使用,导致程序异常。而 volatile 修饰的 long,double 类型,可以保证必须 2 次操作都完成后才可进行下一步操作。某种程度上就是保证了 long,double 数据读写的原子性。

原创文章,转载请注明出处!http://www.javathings.top/volatile解决了什么问题?/

About: wusq


发表评论

电子邮件地址不会被公开。 必填项已用*标注