对volatile不是很理解,和使用场景

volatile修饰的变量,它将具备两种性质:

第一是保证此变量对所有线程的可见性,即当一个线程修改了这个变量后,这个新值对于其他线程来说是立即可见的。

第二就是保证不进行指令重排序。

求大神科普下,看到线程这里不是很明白,volatile具备可见性没感觉出和一般的变量有什么区别

0
扫码支付0.1元 ×
其他相关推荐
Volatile 的使用场景及使用模式说明
参考文章:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
12-volatile关键字使用场景
volatile关键字使用场景Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。
两张图理解volatile关键字
最近又看了一下volatile关键字,以前觉得花很大功夫才理解的东西发现其实也没自己想的那么难,画个模型图然后再跑跑代码感觉很容易就理解了,而且记的也牢,虽然JDK1.7,JDK1.8的synchronized关键字已经优化的很好了,但也不能synchronized关键字一条道走到黑,哈哈。 内存模型概念 计算机执行程序时,指令都是由cpu执行的,执行指令必然会涉及到数据的读写,cpu执行...
volatile的原理和使用场景
上下文切换 CPU为每个线程分配时间片(几十ms),CPU不断切换线程执行,切换的时候会记录状态,保证能够从原来的状态继续执行。当然上下文切换是有开销的,当线程执行时间非常短时我们用并发可能会耗时更久。使用【Lmbench3】和【vmstat】可以测量上下文切换的时间和次数。 为了降低开销我们应减少上下文切换,多线程竞争锁会引起上线文切换,CAS算法无需加锁,可以减少上线文切换,使用最少线程(...
java volatile关键字(及使用场景)
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。比如下面的代码:  /**
volatile具体使用场景
volatile特别适合于状态标记量举个栗子:volatile boolean inited = false; // 线程1 context = loadContext(); inited = true; // 线程2 while(!inited) { sleep(); } doSomethingWithConfig(context);分析:上面的代码利用volatile修饰的init...
Synchronized和volatile 的区别,两者使用的场景
同步关键字Synchronized使用的场景:  Synchronized的修辞范围为:   1. 修饰一个代码块    2.修饰一个方法    3.修饰一个类    4.修饰一个静态的方法 public class Thread1 implements Runnable { public void run() { synchronized(this) { ...
volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?
[转]JVM锁机制volatile/synchronized/lock 2014-9-9阅读213 评论0 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会引起处理器缓存(CPU高级缓存L1/L2/L3)回写到内存。一个处理器的缓存回写到内存会导致其他处理器的缓存无效。 2.JVM锁机制-
对嵌入式C语言中volatile的理解
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:
我对volatile关键字的理解
Java中有一个比较隐晦的关键字volatile,关于它我来谈谈自己的理解。 volatile 总体来讲有两个作用: 保证所修饰的变量对其它线程是立即可见的 禁止指令重排序 什么叫立即可见?我们都知道内存要比硬盘快得多,cpu又比内存快得多,在进行IO操作时这三者效率严重不协调怎么办?所以会先从硬盘加载一部分数据缓存到内存中,而内存又会缓存一部分数据到cpu缓存中,以保证IO的高效。 ...
volatile使用场景
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变...
java volatile变量及其使用场景
java中的一种稍弱的同步机制,就是volatile变量,用于确保将变量的更新操作通知到其他线程。 变量声明为volatile后: (1)编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序(重排序不懂的,可以自行百度,需要理解)。 (2)volatile变量不会被缓存在寄存器或对其他处理器不可见的地方 因此volatile变量总是会返回最新的值。 ...
学习总结系列--volatile使用场景
1.volatile使用场景: (1)根据经验总结,volatile最适合使用的地方是一个线程写、其它线程读的场合,如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。 (2)假如一个线程写、一个线程读,根据前面针对volatile的应用总结,此时可以使用volatile来代替传统的synchronized关键字提升并发访问的性能。 (3)Netty中大量使用了...
彻底明白volatile关键字
一,基本概念1,CPU多核时代的到来,引入了著名的缓存一致性问题。(通常称这种被多个线程访问的变量为共享变量)。硬件层面有两个方案,一是对总线加LOCK,禁止别的CPU访问;二是MESI协议(如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会...
关于“volatile关键字无法保证原子性”的一些理解
Volatile关键字的粗浅理解在学习并发编程的时候了解到,volatile关键字有两个作用:1. 并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据2. 并发环境有序性:...
关于Volatile关键字的一点个人理解
           volatile的特性:     当我们声明共享变量为volatile后,该变量的更新将会对其他线程具有内存可见性,本质就是通过线程间这种数据更新通知来实现数据同步,而传统的做法通过加锁的方式来实现数据同步,但由于锁的性能损耗太大,所以有了通过volaitle关键字来通过无锁的方式来达到同样的目的.OK,扯了半天废话,直接上我画的草图吧,各位看官如果觉得我哪里说的不妥,...
ThreadLocal理解及应用
本次给大家介绍重要的工具ThreadLocal。介绍什么场景下发生内存泄漏,如何复现ThreadLocal内存泄漏,如何正确使用它来避免内存泄漏。以下为文章主题: 1. ThreadLocal是什么?有哪些用途? 2. ThreadLocal如何使用 3. ThreadLocal原理 4. ThreadLocal使用有哪些坑及注意事项
java的内存模型与volatile关键字详解
由于各种硬件及操作系统的内存访问差异,java虚拟机使用java内存模型(java Memory Model,JMM)来规范java对内存的访问。这套模型在jdk 1.2中开始建立,经jdk 1.5的修订,现已逐步完善起来。什么是java内存模型什么是java内存模型,为什么会有这个模型?关于这个问题,就不得不从并发的问题讲起。在多核系统中,处理器一般设置缓存来加速数据的读取,缓存大大提升了程序性能
并发编程之ThreadLocal、Volatile、synchronized、Atomic关键字扫盲
前言对于ThreadLocal、Volatile、synchronized、Atomic这四个关键字,我想一提及到大家肯定都想到的是解决在多线程并发环境下资源的共享问题,但是要细说每一个的特点、区别、应用场景、内部实现等,却可能模糊不清,说不出个所以然来,所以,本文就对这几个关键字做一些作用、特点、实现上的讲解。1、Atomic作用对于原子操作类,Java的concurrent并发包中主要为我们提供
只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:1对变量的写操作不依赖于当前值。 2该变量没有包含在具有其他
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。  Java 语言中的 vol
多线程之volatile、ThreadLocal、synchronized关键字区别
1.volatile volatile主要是用来在多线程中同步变量。 在一般情况下,为了提升性能,每个线程在运行时都会将主内存中的变量保存一份在自己的内存中作为变量副本,但是这样就很容易出现多个线程中保存的副本变量不一致,或与主内存的中的变量值不一致的情况。 而当一个变量被volatile修饰后,该变量就不能被缓存到线程的内存中,它会告诉编译器不要进行任何移出读取和写入操作的优化,换句话说...
CAS与Synchronized的使用情景
CAS与Synchronized的使用情景 1、对于资源竞争较少(线程冲突较轻)的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态到内核态间的切换操作额外浪费消耗cpu资源;而CAS基于操作借助C来调用CPU底层指令实现的,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。  2、对于资源竞争严重(线程冲突严重)的情况,CAS自旋的概率会比较大,...
Java并发偏向锁、轻量级锁、重量级锁、synchronized和volatile的实现原理
读Java并发编程的艺术学习整理。 1. 上下文切换 CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任...
面试题--java中volatile关键字的含义
本文转载自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synch
Java 关键字 volatile 的应用场景
synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件: 1)对变量的写操作不依赖于当前值 2)该变量没有包含在具...
关于volatile对变量自增不保证原子性的原因所产生的疑问。
在多线程情况下,有i变量: volatile int i = 0; 这种情况下,如果多线程对i进行自增操作:i++,结果可能会与预期值不同,这是什么原因呢? 先来看看大多人对这一错误的解释: 是因为volatile不能保证原子性,而i++其实有三步操作,读,修改,写,并不是原子操作,所以volatile当然不能保证结果的准确性,解释完毕! 其实博主我觉得这种解释相当的流氓 让我想起
ThreadLocal适用场景与正确原理
ThreadLocal 解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal,为表述方便,后文用 变量 代表 ThreadLocal 本身,而用 实例 代表具体类型(如 StringBuidler )的实例。 不恰当的理解 写这篇文章的一个原因在于,网上很多博客关于 ThreadLocal 的适用场景以及解决的问题,描述的并不清楚,甚至
深入理解volatile关键字的作用(一)
  (一)计算机内存模型 大家都知道在计算机执行程序的时候每条指令都是在cpu中执行的,那么执行指令的同时势必会有读取和写入的操作,那么这样就引申出了一个问题。那么在程序运行时数据的存储是在计算机中的主存中(物理内存)的而内存的读取和写入的速度与cpu的执行指令速度相比差距是很大的,这样就造成了与内存交互时程序执行效率大大降低,因此在cpu中就有了高速缓存。  也就说计算机cpu在执行指令时...
对于volatile型变量的特殊规则(深入理解Java虚拟机学习笔记)
关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、 完整地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。 了解volatile变量的语义对后面了解多线程操作的其他特性很有意义,在这里我们将多花费一些时间去弄清楚volatile的语义到底是什么。Java内存模型对volatile专门
为什么volatile++不是原子性的?
问题 在讨论原子性操作时,我们经常会听到一个说法:任意单个volatile变量的读写具有原子性,但是volatile++这种操作除外。 所以问题就是:为什么volatile++不是原子性的? 答案 因为它实际上是三个操作组成的一个符合操作。 首先获取volatile变量的值 将该变量的值加1 将该volatile变量的值写会到对应的主存地址 一个很简单的例子: 如果两个线程在...
volatile失效,慎重使用volatile关键字
volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的。但这有一定的限制。例如,下面的例子中的n就不是原子级别的: package mythread;   public class JoinThread ext
synchronized关键字与volatile原理浅析
synchronized关键字与volatile关键字可以说是Java多线程的基础,无论是各种同步锁,还是我们所遇到的线程安全问题,都与这两个关键字有联系。 Synchronized Synchronized关键字我们经常用来执行线程间的互斥操作,使用示例如下: int x; public synchronized void setX(int x) { ...
Java volatile关键字作用
当一个共享变量被volatile修饰时,它会保证修改的值立即被更新到主存“, 这里的”保证“ 是如何做到的?和 JIT的具体编译后的CPU指令相关吧?   volatile特性   内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。   volatile的使用场景   通过关键字sychronize...
volatile关键字和CAS
volatile关键字的两层语义一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。
关于volatile关键字与内存可见性的一点理解
在日常写java代码的环境下(不是研究计算机理论的情况)是会观测到内存可见性所带来的一些问题,比如下面这段代码: public class ReorderingDemo { static boolean flag = false; public static void main(String[] args) throws Exception { new T...
volatile为什么不能保证原子性的思考
1、故事的起因:         前几天有人问过关于volatile关键字的一些问题, 想起了自己刚接触这个关键字时候存在的疑惑,赶上今天有时间就整理了一些自己的想法。         首先,需要明确的一点是,volatile关键字修饰的变量可以保证该变量操作的有序性和可见性, 但是保证不了操作的原子性。         关于volatile关键字修饰的变量在确保变量操作的有序性和可见性的介...
Java基础面试总结(四、深入理解volatile关键字)
被volatile修饰的变量,可以保证不同的线程都能多能取得最新状态值;volatile保证了可见性,避免在线程在缓存中取旧值;1. volatile 保证可见性一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。2...
简单理解ThreadLocal原理和适用场景,多数据源下ThreadLocal的应用
一、ThreadLocal简单介绍首先,ThreadLocal是用来维护本线程的变量的,并不能解决共享变量的并发问题。ThreadLocal是各线程将值存入该线程的map中,以ThreadLocal自身作为key,需要用时获得的是该线程之前存入的值。如果存入的是共享变量,那取出的也是共享变量,并发问题还是存在的。简单看一下例子:public class TestThreadLocal { ...
volatile不能保证原子性
volatile
对于volatile型变量的特殊规则
关键字是Java虚拟机提供的最轻量级的同步机制 当一个变量定义为volatile之后,它具有两种特性: 保证此变量对所有线程的可见性:当一条线程修改了这个变量的值时,新值能立即同步到主内存中,因此其他线程可以立即得知该变量修改后的值。 在以下两种情况下能保证线程的安全性,其余情况我们仍要通过加锁来保证原子性: 运行结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值 变量不需要...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 对物联网培训的理解 对物联网的学习理解