一、从另一个角度了解JAVA的可见性

什么是可见性问题

在多线程环境下,一个线程对某个共享变量更新之后,其它线程访问该变量的线程,是否可以立刻读取到这个变量的更新结果,或者说,线程A对共享变量的修改,是否对线程B可见。这就是线程安全问题的另一个表现形式,可见性。

为什么出现这样的问题

线程是运行在处理器上,现在的计算机大多数都是多核的,计算机有主内存(RAM)、每个处理器有自己的写缓冲器(Store Buffer)、高速缓存,由于读取速度不匹配,所以处理器并不是直接与主内存打交道,内存的读写操作都是通过寄存器、高速缓存、写缓冲器、无效化队列等部件执行内存读写的。这些部件相当于主内存数据的副本,副本存储的份数越多,数据一致性越难保证。多个处理器读写数据也是优先读写当前处理器的副本数据,这就可能导致多个副本之间数据不一致。

既然有这样的问题,处理器是如何屏蔽的呢,这就引入了缓存一致性协议,也就是俗称的缓存同步。缓存同步使得一个处理器上可以读取到另一个处理器对共享变量所做的更新。在这里缓存一致性读者可以下来看一下MESI协议。

所以,缓存同步的是可以保障可见性的。

对变量的更新缓存的层级关系如下:
写缓冲器 -> 高速缓存 -> 主内存

下面我们看两个定义

  • 处理器对共享变量所做的更新操作,从写缓冲器中写入处理器的高速缓存或者主内存中,这个动作被称为冲刷处理器缓存
  • 处理器读取共享变量时,如果其它处理器更新了该值,那么处理器要从其它处理器的高速缓存或者主内存中进行同步相应的变量值到本缓存,这个动作被称为刷处理器缓存
  • 对于上面两个定义,我们提取一下关键字:

    **共享变量**     **更新(写)**      **读取(读)** 

看到这里,我们其实主要提到的关键字是共享变量,主要的操作是读写,也就是说对于共享变量的读写才会有可见性问题。

处理器会在写共享变量的时候冲刷处理器,读取共享变量的时候刷新处理器缓存,保证对变量的更新已经同步到高速缓存或者主内存,然后通过MESI协议,保证共享变量在多线程的可见性。

从这个角度来分析,只要我们告诉处理器,谁是共享变量,处理器就可以保证该变量的可见性了

但是遗憾的是,JAVA中的变量都是JVM堆中存储的,无法告诉处理器哪个变量是共享变量。但是既然已经知道了处理器是怎么保证可见性的, 那么我们是不是可以定义一个关键字,对于这个关键字做下面这样的处理,就可以保证可见性呢

读的时候去刷处理器缓存,写的时候去冲刷处理器缓存

java中就是这样处理的,在java中,有一个关键字volatile大家一定都知道,怎么去理解它

  • 被volatile标识的变量,其实就是告诉处理器,该变量是共享变量,需要保证该变量的可见性
  • 另一方面,被volatile修饰的变量,可以告诉JIT编译器该变量可能会被共享,优化时悠着点儿。

从CPU指令角度来看volatile关键字的实现 ,其实是使用到的内存屏障,通过内存屏障保证在共享变量写的时候冲刷处理器共享变量读的时候刷新处理器缓存。volatile关键字的内存屏障具体是如何实现的, 后续会有文章更新,希望大家继续关注我。

到这里,希望看到本文章的读者是,可以从另一个角度去认识JAVA中的volatile关键字。

结尾再废话两句

在说起可见性的时候,我们说到了多线程,说到多线程我们一定会与多个处理器想到一起,其实并非在多个处理器下才会出现可见性问题, 在单核处理器也会出现可见性问题

单个处理器,在线程切换的时候 ,当前线程对共享变量的修改会作为线程的上下文保存起来,这就可能导致其它处理器无法看到该线程对共享变量的更新(无法看到该变量的相对新值)。

下面可能可能会写一篇关于JAVA中有序性的文章,请大家继续关注 

希望大家可以继续关注我,一起成长,记录下成长路上的点点滴滴。

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

推荐阅读更多精彩内容