Java教程

Java多线程volatile关键字

本文主要是介绍Java多线程volatile关键字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

volatile的应用

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令

volatile是个轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。可见性的意思就是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

volatile的定义

Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,某些情况下比所更方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

volatile的内存语义

当声明共享变量为volatile后,对这个变量的读/写将会很特别。

锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味着对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。

锁的语义决定了临界区代码的执行具有原子性。这意味着即使是64位的long型和double型变量,只要是volatile变量就具有原子性。多个volatile整体上不具有原子性。

简而言之,volatile变量自身具有下列特性:

  • 可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入
  • 原子性:对任意的单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。
这篇关于Java多线程volatile关键字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!