volatile 型变量的特殊规则
关键字 volatile 可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易被正确地,完全地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线程数据竞争的问题时一律使用 synchronized 来进行同步。一定要弄清楚volatile 型变量的语义是什么。
当一个变量被定义成volatile 之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的"可见性"是指当一条线程修改了这个变量,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,变量值在线程间传递均需要通过主内存来完成,如:线程A修改了一个普通变量,然后向主内存进行回写,另外一条线程B在线程A回写完成了之后再从主内存进行读取操作,新变量的值才会对线程B可见。
volatile 型变量在各个线程的工作内存中不存在一致性问题(在各个线程的工作内存中volatile 变量也可以存在不一致的情况,但由于每次使用之前都要刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性的问题),但是Java里面的运算并非原子性,导致volatile 变量的运算在并发下一样是不安全的。
由于volatile 变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁(使用synchronized或java.util.concurrent中的原子类)来保证原子性。
使用volatile 变量的第二个语义是禁止指令重排序优化,普通变量仅仅会保证在该方法的执行过程中所有依赖复制结果的地方都能获取正确的结果,而不能保证变量的赋值的顺序与程序代码中的执行顺一致。因为在一个线程方法执行过程中无法感知这点,这也就是Java内存模型中描述的所谓'"线程内表现为串行的语义"。
volatile 同步机制的性能要优于锁(synchronized或java.util.concurrent中的锁),但是由于虚拟机对锁实行的许多消除和优化,使得我们很难量化地说volatile 就会比synchronized快上多少。如果让volatile 自己与自己比较,则可以确定一个原则:volatile 变量读操作的性能消耗与普通变量及就没有什么差别,但是写操作可能会慢上一些,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
Java内存模型中对volatile 变量定义的特殊规则:
-
volatile变量的操作必须按read->load->use顺序,即每次在工作内存中使用变量前必须先从主内存中刷新最新的值,以保证能看到其他线程对变量的最新修改。
-
volatile变量的操作必须按assign->store->write顺序,即每次在工作内存为变量赋值之后必须将变量的值同步回主内存,以保证让其他线程能看到变量的最新修改。
-
若线程对volatile变量A的assign或者use操作先于对volatile变量B的assign或者use操作,则线程对volatile变量A的read/load或者store/write操作也必定先于对volatile变量B的read/load或者store/write操作。
分享到:
相关推荐
C++变量命名规则 C++变量命名规则是为了增强代码的可读性和容易维护性。以下是C++必须遵守的变量命名规则: 一、 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。 二、 第一个字母必须是字母...
C++变量名规则 C++变量名规则是指在C++语言中命名变量的规则和约定。这些规则和约定旨在提高代码的可读性、维护性和重用性。良好的变量名规则可以帮助开发者快速理解代码的意图和目的,提高开发效率和代码质量。 ...
### VC++ 变量命名规则详解 在编程领域,遵循一套规范的命名约定对于提高代码的可读性和可维护性至关重要。本篇文章将深入探讨VC++中的变量命名规则,这不仅是对初学者的重要指导,也是专业程序员提升代码质量的...
尤其当涉及到大量的BOOL型变量时,通信负担会显著增加,可能导致数据传输延迟、丢包甚至系统不稳定。通过巧妙地利用BYTE或DWORD型变量,可以有效地降低通信负载。以下是一些具体的实施步骤和策略: 1. **使用DWORD...
"连续型随机变量的数学期望与方差PPT课件.pptx" 本资源主要讲解连续型随机变量的数学期望和方差的概念、定义、计算公式和性质。资源共20页,涵盖了数学期望的定义、方差的定义、标准差的定义、数学期望的性质、方差...
保持型变量,又称为持续变量,是CODESYS中一个特殊类型的变量。这类变量的特性在于,即使在电源中断或系统重启后,它们的值仍能被保留。这种特性在需要数据持久化的应用中非常有用,例如在处理计数器或记录历史数据...
5. **保留字避免**:变量名不能与C语言的保留字相同,如int、char、for、while等,这些保留字有特殊的含义,用于语法结构。 6. **命名约定**:为了提高代码的可读性,开发者通常会遵循一定的命名约定。例如,用小写...
变量命名规则 下面是关于变量名(也称为标识符)的一些规则 必须以一个字母或一个下划线字符开头。后面可以使用一个字母、数字或下划线字符的序列,长度不限。 字母可以是大写或小写,大小写是不同的。也就是说,...
C语言变量名命名规则[整理].pdf
离散型随机变量均值与方差教学目标 本教学目标旨在帮助学生理解离散型随机变量的均值或期望的概念、公式和应用,以及离散型随机变量的方差、标准差的概念和公式。 一、离散型随机变量的概念 * 随机变量:如果随机...
保持型变量在PLC断电后仍能保留其最后的状态,而非保持型变量在电源中断后将复位为初始值。下面详细介绍如何在TIA PORTAL中设置DB块中的变量数据为保持型或不保持。 首先,我们来看第一种情况,即优化的DB块: 1. ...
将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少? 【输入】 一个整型范围内的整数,即初始时整型变量的值。 【输出】 一个整数,经过上述过程后得到的结果。 ...
在 Java 编程语言中,变量是存储数据的基础单元,理解和掌握变量的命名规则和分类对于编写高质量的代码至关重要。本文将深入探讨 Java 中的变量命名规则、分类及其概述。 首先,我们来看变量的命名规则: 1. **有...
二维离散型随机变量 概率统计是统计学中的一门重要分支,它对随机事件的研究具有重要意义。在概率统计中,随机变量是研究的对象,而二维离散型随机变量是其中一个重要的概念。 什么是二维离散型随机变量?设随机...
C语言变量命名规则.doc
KUKA机器人如何自定义数值型变量?
模糊控制模糊规则讲解
2. 变量命名规则:KUKA 的变量命名遵循特定的规则,通常包含前缀、类型标识和变量名,如 "KRLVAR" 开头表示 KUKA Robot Language 变量。 3. 变量读写:在 KUKA 的编程语言 KRL(KUKA Robot Language)中,你可以...