volatile的应用
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在cpu上执行,Java中所使用的并发机制依赖于JVM的实现和cpu的指令@H_502_5@
volatile是个轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。可见性的意思就是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。@H_502_5@
volatile的定义
Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,某些情况下比所更方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。@H_502_5@
volatile的内存语义
当声明共享变量为volatile后,对这个变量的读/写将会很特别。@H_502_5@
锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味着对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。@H_502_5@
锁的语义决定了临界区代码的执行具有原子性。这意味着即使是64位的long型和double型变量,只要是volatile变量就具有原子性。多个volatile整体上不具有原子性。@H_502_5@
简而言之,volatile变量自身具有下列特性:@H_502_5@
- 可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入
- 原子性:对任意的单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。