java volatile关键字的使用

处理并发操作除了使用synchronized,还有一个效率比较高的关键字就是volatile

要想理解volatile必须要理解两个概念:

1、内存模型的概念

2、并发编程中的三个概念

一、内存模型的概念

大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面的这段代码:

i =i+1

当线程执行到这一句代码的时候,会发生如下一系列操作

从主内存中读取 i 的值-----复制一份到自己所在cpu的高速缓存----CPU将i进行加 1 操作----写入到自己的高速缓存----最后将高速缓存中i最新的值刷新到主存当中

这段代码在单线程当中是没有问题的,多线程就会发生问题,假如i的初始值为0,然后有两个线程来执行上面的代码,我们希望看到的结果是 i 的值变为2,但是结果并不一定是这样的,首先线程1开始执行代码,从主存中读取i的值0,复制自己的工作线程中进行加1 操作,这时线程2进来的也从主存中读取i 值,注意这时候 i 的值还是0,因为线程1还没有来的及将计算之后的值写入到主存,这样就会导致最终的结果是1


图1

二.并发编程中的三个概念

在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:

1、原子性

即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

2、可见性

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

//线程1执行的代码

int  i =0;

i =10;

//线程2执行的代码

j = i; 

用代码简单理解上面的定义就是说 初始 i = 0,然后修改到10,这时候j必须也要为10,就是说 i 修改后必须反映到 j 上面。

但是实际情况并不是这样的,j 有可能是0而不是10,因为 线程1在工作线程当中改了 i 的值后并不一定立即刷新到主存当中,所以 j 比一定就是10


3、有序性

即程序执行的顺序按照代码的先后顺序执行。

int a = 0;//1

boolean flag = true;//2

i = 1;//3

flag = false;//4

代码3写在代码4前面,看上去应该是3比4先执行,但实际上却不是的,因为在jvm中存在指令重排。

下面解释一下什么是指令重排序,一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。

要想解决并发编程必须满足上面这三个条件

好了,说了那么多铺垫,来到我们的重点 volatile

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义

一、保证了不同线程对这个变量操作的可见性,即一个线程修改了变量其他的线程获取这个变量的值时立马更新

二、禁止指令重新排序

也就是说volatile保证了可见性和有序性,但是不能保证原子性

 volatile是如何实现可见性的:

当一个变量被volatile修饰的时候,然后对这个变量的值修改的时候,修改之后工作内存中新的值会立即更新主存中的值,并且在主存中将这个值标记为最新的,其他线程会跟这个标记进行对比来判断是否需要更新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 转自:http://www.cnblogs.com/dolphin0520/p/3920373.html vola...
    王帅199207阅读 458评论 0 0
  • volatile 关键字解析 原文出处: 海子volatile 这个关键字可能很多朋友都听说过,或许也都用过。在 ...
    常青大侠阅读 589评论 0 4
  • 在这个浮华的尘世中,每个人都是一个孤独游离的个体,不停的结识新的个体,身边能陪伴你的人也像细胞新陈代谢一样换...
    柠檬茶尔阅读 385评论 0 3
  • 今天我要解析的剧本是《中国合伙人》,相信很多人都看过这部励志片,所以我要特别声明我解析的是剧本,而不是影评。 所以...
    Andy胡良云阅读 6,342评论 6 12
  • 精进 无知不是理由,无谓不是借口,无心不代表无过 感受 语言是把双刃剑,不能总以自我为中心,说话还需思考 收获 总...
    若兰ZHOU阅读 133评论 0 1