国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JUC之volatile

2019-11-14 08:44:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、簡(jiǎn)介

volatilejava語(yǔ)言的關(guān)鍵字,用來(lái)修飾可變變量(即該變量不能被final修飾),且必須是至少類內(nèi)可見(jiàn)。所以它是可以修飾帶static的變量。這我自己下定義。

它是被設(shè)計(jì)用來(lái)修飾被不同線程訪問(wèn)和修改的變量。來(lái)自 百度百科

二、功能

volatile提供了一個(gè)高效的同步機(jī)制,她在某些情況下可以代替synchronized實(shí)現(xiàn)更輕量和高效的同步機(jī)制,同時(shí)也更為脆弱,更難于掌控。被volatile修飾的變量具有內(nèi)存可見(jiàn)性,但不具有原子性。至于什么是可見(jiàn)性,前面已經(jīng)做過(guò)簡(jiǎn)單介紹,接下來(lái)我們進(jìn)一步來(lái)看什么是可見(jiàn)性。

1. 內(nèi)存可見(jiàn)性

首先為什么會(huì)出現(xiàn)內(nèi)存可見(jiàn)性問(wèn)題呢? 想完全理解這個(gè)問(wèn)題,請(qǐng)自行閱讀《深入理解計(jì)算機(jī)系統(tǒng)》吧!這里簡(jiǎn)單說(shuō)一下,

每個(gè)線程都有它自己的線程上下文,包括棧、棧指針、程序計(jì)數(shù)器、通用目的寄存器和條件碼。所有的運(yùn)行在一個(gè)進(jìn)程里的共享該進(jìn)程的整個(gè)虛擬地址空間。——來(lái)自《深入理解計(jì)算機(jī)系統(tǒng)》

下面這個(gè)說(shuō)法可能并不嚴(yán)謹(jǐn),甚至是有誤,但對(duì)我們理解這個(gè)問(wèn)題有幫忙。 如你所知,所有計(jì)算都發(fā)生CPU,然而它直接操作主存的效果比較遠(yuǎn),不如CPU的緩存區(qū),更遠(yuǎn)不如寄存器。其次,如上面所有的系統(tǒng)會(huì)為每個(gè)線程分配自己的線程上下文。在這兩個(gè)大提前下,可能簡(jiǎn)化的理解為線程有自己的高速cache,即所有線程操作變量時(shí),都不會(huì)直接操作主存。當(dāng)發(fā)生cache miss時(shí),從主存拷貝到cache,這些都是你懂的啦。跟所有的cache一樣,都存在一致性的問(wèn)題。

即是正常情況下什么時(shí)候發(fā)生cache沖刷回主存并不可控。 不正常情況下,退出臨界區(qū)時(shí)即刻強(qiáng)制更新主存。另一種情況,即我們要討論的volatile。被volatile修飾的變量比較特殊,表示直接操作主存,不需要通過(guò)cache。直接要用時(shí)直接從主存取(注意取出來(lái)還是會(huì)把值放在自己的上下文,這點(diǎn)后面需要用到),用完寫(xiě)直接回主存。這就是內(nèi)存可見(jiàn)性

2. 可不完全替代synchronized

之前整理synchronized的時(shí)候忘了講synchronized怎么實(shí)現(xiàn)同步的,在這里順便帶出來(lái)吧。 synchronized是通過(guò)臨界區(qū)實(shí)現(xiàn)同步的,臨界區(qū)的同步方式是同一個(gè)時(shí)間只有最多一個(gè)線程進(jìn)入臨界區(qū),也就是說(shuō)只能保證原臨界區(qū)具有原子性。這是什么意思呢,先來(lái)看一下面例子吧。

void barfoo() { new Thread(() -> { for(int v=0; v<100; v++) bar(); }).start(); new Thread(() -> { for(int v=0; v<100; v++) foo(); }).start(); }}int v = 0;void bar() { final int t = v + 1; v++; try { TimeUnit.MILLISECONDS.sleep(RandomUtils.nextInt(10)); } catch (InterruptedException e) { } if(t != v)System.out.執(zhí)行barfoo()的結(jié)果打印了not match。 synchronized只是通過(guò)線程在離開(kāi)臨界區(qū)時(shí)會(huì)把線程上下文沖刷回主存,從而實(shí)現(xiàn)一致性,但對(duì)于變量v而言不具備原子性,更無(wú)法保證能夠一致性。

volatile可部分替代synchronized,也就是說(shuō)在特定條件或者場(chǎng)景下可以替代synchronized。上面我們提到過(guò)volatile具有內(nèi)存可見(jiàn)性,但不具有原子性,而synchronized實(shí)際是上能夠實(shí)現(xiàn)原子性的。這一點(diǎn)是volatile做不到的,也是這種場(chǎng)景下volatile無(wú)法代替synchronized。 這一點(diǎn)就不舉例了,主要知道什么是原子性和非原子性即可自行實(shí)驗(yàn)了。如:a += b就一個(gè)非原子性操作。

三、總結(jié)

簡(jiǎn)單的了解了volatile的用法;進(jìn)一步了解內(nèi)存可見(jiàn)性和synchronized實(shí)現(xiàn)原理;volatile與synchronized的差異,以及可代替場(chǎng)景;volatile通過(guò)內(nèi)存可見(jiàn)性實(shí)現(xiàn)同步,即線程A操作了被volatile修飾的變量之后,線程B立馬可能讀到線程A的修改結(jié)果。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 察雅县| 专栏| 九龙县| 黄浦区| 安新县| 河津市| 邵阳市| 长岭县| 山阴县| 右玉县| 菏泽市| 蓝山县| 南宁市| 中江县| 麻栗坡县| 抚顺县| 凤阳县| 太仆寺旗| 贡山| 肇东市| 大英县| 紫阳县| 上蔡县| 柘城县| 广南县| 从江县| 壶关县| 怀来县| 马关县| 安乡县| 渝中区| 阳山县| 茌平县| 东乡县| 浙江省| 双柏县| 姚安县| 安西县| 呼玛县| 扶余县| 阿克|