Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践

中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。

Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized

”;与 synchronized

块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized

的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。

锁提供了两种主要特性:互斥(mutual exclusion)

和可见性(visibility)

互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加

复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 ——

如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。

Volatile 变量

Volatile 变量具有 synchronized

的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile

变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用

volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start

<=end”)。

出于简易性或可伸缩性的考虑,您可能倾向于使用 volatile 变量而不是锁。当使用

volatile 变量而非锁时,某些习惯用法(idiom)更加易于编码和阅读。此外,volatile

变量不会像锁那样造成线程阻塞,因此也很少造成可伸缩性问题。在某些情况下,如果读操作远远大于写操作,volatile

变量还可以提供优于锁的性能优势。

正确使用 volatile 变量的条件

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

对变量的写操作不依赖于当前值。

该变量没有包含在具有其他变量的不变式中。

实际上,这

java 理论与实践,Java 理论与实践: 正确使用 Volatile 变量相关推荐

  1. 转Java 理论与实践: 正确使用 Volatile 变量

    Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...

  2. Java 理论与实践: 正确使用 Volatile 变量--转

    原文地址:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html Java 语言中的 volatile 变量可以被看作是一种 "程 ...

  3. Java 理论与实践: 正确使用 Volatile 变量

    2019独角兽企业重金招聘Python工程师标准>>> ava 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 s ...

  4. java 正确使用 Volatile 变量

    为什么80%的码农都做不了架构师?>>>    http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 转载于:https ...

  5. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  6. java中的Volatile 变量

    Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...

  7. Java常见面试题_理论+实践

    Java面试宝典2010版 一. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说 ...

  8. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...

    JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...

  9. Atitit.http httpclient实践java c# .net php attilax总结

    Atitit.http httpclient实践java c# .net php attilax总结 1. Navtree>> net .http1 2. Httpclient理论1 2. ...

最新文章

  1. 用 Python 制作数据大屏,超简单
  2. gcc命令-更新中....
  3. CodeForces - 1293C NEKO's Maze Game(思维,水题)
  4. Cython与CPython的区别
  5. [React] 尚硅谷 -- 学习笔记(六)
  6. NUMA - Non Uniform Memory Architecture 非统一内存架构
  7. 双指针--无重复最长子串
  8. Leetcode122. 买卖股票的最佳时机 II(贪心)
  9. STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
  10. Issure: LookupError: unknown encoding: cp65001
  11. 7-2 秋天的第一杯奶茶 (5 分)
  12. Android studio emulator Terminated
  13. 人工智能和自动化之间,主要有区别吗?
  14. 哈希表、哈希桶的实现
  15. 上海公积金贷款买房攻略详细解读
  16. 费解的开关 Java
  17. 视频直播的 推流是啥意思
  18. 为什么必须了解云原生?!
  19. 最长情的告白就是陪伴【Python七夕祝福】——那些浪漫的开始
  20. 四年一次的世界杯来了,看看还剩下哪些赛程呢?

热门文章

  1. docker nginx安装模块_docker安装nginx与php7.1
  2. Android六大布局 LinearLayout(线性布局)
  3. 修改密码后服务器断开连接,SSH无需密码登录服务器且保持连接不断开的方法
  4. hive mysql 远程_ubuntu中为hive配置远程MYSQL database
  5. 人群密度估计--Structured Inhomogeneous Density Map Learning for Crowd Counting
  6. 人脸对齐--Face Alignment at 3000 FPS via Regressing Local Binary Features
  7. 快速人群密度估计--Multi-scale Convolutional Neural Networks for Crowd Counting
  8. 解决AttributeError: module ‘tensorflow_core._api.v2.config‘ has no attribute ‘experimental_list_device
  9. LeetCode 438. Find All Anagrams in a String--字符串-滑动窗口--C++,Python解法
  10. ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码