最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中volatile關(guān)鍵字的作用與用法詳解

 更新時(shí)間:2016年09月29日 16:23:58   作者:11樓的日記  
volatile關(guān)鍵字雖然從字面上理解起來(lái)比較簡(jiǎn)單,但是要用好不是一件容易的事情。這篇文章主要介紹了Java中volatile關(guān)鍵字的作用與用法詳解的相關(guān)資料,需要的朋友可以參考下

volatile這個(gè)關(guān)鍵字可能很多朋友都聽說(shuō)過(guò),或許也都用過(guò)。在Java 5之前,它是一個(gè)備受爭(zhēng)議的關(guān)鍵字,因?yàn)樵诔绦蛑惺褂盟鶗?huì)導(dǎo)致出人意料的結(jié)果。在Java 5之后,volatile關(guān)鍵字才得以重獲生機(jī)。

volatile 關(guān)鍵字作用是,使系統(tǒng)中所有線程對(duì)該關(guān)鍵字修飾的變量共享可見,可以禁止線程的工作內(nèi)存對(duì)volatile修飾的變量進(jìn)行緩存。

volatile 2個(gè)使用場(chǎng)景:

1.可見性:Java提供了volatile關(guān)鍵字來(lái)保證可見性。

  當(dāng)一個(gè)共享變量被volatile修飾時(shí),它會(huì)保證修改的值會(huì)立即被更新到主存,當(dāng)有其他線程需要讀取時(shí),它會(huì)去內(nèi)存中讀取新值。

  而普通的共享變量不能保證可見性,因?yàn)槠胀ü蚕碜兞勘恍薷闹?,什么時(shí)候被寫入主存是不確定的,當(dāng)其他線程去讀取時(shí),此時(shí)內(nèi)存中可能還是原來(lái)的舊值,因此無(wú)法保證可見性。

  另外,通過(guò)synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時(shí)刻只有一個(gè)線程獲取鎖然后執(zhí)行同步代碼,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到主存當(dāng)中。因此可以保證可見性。

先看一段代碼,假如線程1先執(zhí)行,線程2后執(zhí)行:

//線程1
boolean stop = false;
while(!stop){
doSomething();
}
//線程2
stop = true;

  這段代碼是很典型的一段代碼,很多人在中斷線程時(shí)可能都會(huì)采用這種標(biāo)記辦法。但是事實(shí)上,這段代碼會(huì)完全運(yùn)行正確么?即一定會(huì)將線程中斷么?不一定,也許在大多數(shù)時(shí)候,這個(gè)代碼能夠把線程中斷,但是也有可能會(huì)導(dǎo)致無(wú)法中斷線程(雖然這個(gè)可能性很小,但是只要一旦發(fā)生這種情況就會(huì)造成死循環(huán)了)。

  下面解釋一下這段代碼為何有可能導(dǎo)致無(wú)法中斷線程。在前面已經(jīng)解釋過(guò),每個(gè)線程在運(yùn)行過(guò)程中都有自己的工作內(nèi)存,那么線程1在運(yùn)行的時(shí)候,會(huì)將stop變量的值拷貝一份放在自己的工作內(nèi)存當(dāng)中。

  那么當(dāng)線程2更改了stop變量的值之后,但是還沒來(lái)得及寫入主存當(dāng)中,線程2轉(zhuǎn)去做其他事情了,那么線程1由于不知道線程2對(duì)stop變量的更改,因此還會(huì)一直循環(huán)下去。

  但是用volatile修飾之后就變得不一樣了:

  第一:使用volatile關(guān)鍵字會(huì)強(qiáng)制將修改的值立即寫入主存;

  第二:使用volatile關(guān)鍵字的話,當(dāng)線程2進(jìn)行修改時(shí),會(huì)導(dǎo)致線程1的工作內(nèi)存中緩存變量stop的緩存行無(wú)效(反映到硬件層的話,就是CPU的L1或者L2緩存中對(duì)應(yīng)的緩存行無(wú)效);

  第三:由于線程1的工作內(nèi)存中緩存變量stop的緩存行無(wú)效,所以線程1再次讀取變量stop的值時(shí)會(huì)去主存讀取。

  那么在線程2修改stop值時(shí)(當(dāng)然這里包括2個(gè)操作,修改線程2工作內(nèi)存中的值,然后將修改后的值寫入內(nèi)存),會(huì)使得線程1的工作內(nèi)存中緩存變量stop的緩存行無(wú)效,然后線程1讀取時(shí),發(fā)現(xiàn)自己的緩存行無(wú)效,它會(huì)等待緩存行對(duì)應(yīng)的主存地址被更新之后,然后去對(duì)應(yīng)的主存讀取最新的值。

  那么線程1讀取到的就是最新的正確的值。

2.保證有序性

volatile boolean inited = false;
//線程1:
context = loadContext(); 
inited = true; 
//線程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);

確保context已經(jīng)初始化完成。

3.double check

class Singleton{
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}

以上所述是小編給大家介紹的Java中volatile關(guān)鍵字的作用與用法詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring?Boot常用功能Profile詳解

    Spring?Boot常用功能Profile詳解

    SpringBootProfile是一個(gè)很常用的功能,我們可以通過(guò)為開發(fā)/測(cè)試/生產(chǎn)環(huán)境配置不同的profile來(lái)實(shí)現(xiàn)配置隔離,那么在SpringBoot項(xiàng)目中是如何實(shí)現(xiàn)profile功能的呢
    2022-07-07
  • SpringBoot整合SSE接口實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送

    SpringBoot整合SSE接口實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送

    SSEServer-Sent?Events)是一種基于HTTP的服務(wù)器向客戶端單向?qū)崟r(shí)推送數(shù)據(jù)的技術(shù),本文主要介紹了SpringBoot整合SSE接口實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送的方法,需要的可以參考下
    2025-05-05
  • Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn)

    Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn)

    這篇文章主要介紹了Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java如何使用spire進(jìn)行word文檔的替換詳解

    Java如何使用spire進(jìn)行word文檔的替換詳解

    創(chuàng)作一份文案經(jīng)常會(huì)高頻率地使用某些詞匯,如地名、人名、人物職位等,若表述有誤,就需要整體撤換,下面這篇文章主要給大家介紹了關(guān)于Java如何使用spire進(jìn)行word文檔的替換的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于MVC的dao層、service層和controller層詳解

    關(guān)于MVC的dao層、service層和controller層詳解

    這篇文章主要介紹了關(guān)于MVC的dao層、service層和controller層詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 貪心算法原理及在Java中的使用

    貪心算法原理及在Java中的使用

    我們可能在好多地方都會(huì)聽到貪心算法這一概念,并且它的算法思想也比較簡(jiǎn)單就是說(shuō)算法只保證局部最優(yōu),進(jìn)而達(dá)到全局最優(yōu)。但我們實(shí)際編程的過(guò)程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問(wèn)題必須滿足貪心選擇性質(zhì)
    2021-05-05
  • 用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的布隆過(guò)濾器

    用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的布隆過(guò)濾器

    這篇文章主要介紹了用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的布隆過(guò)濾器,布隆過(guò)濾器是1970年由布隆提出的,它實(shí)際上是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中,需要的朋友可以參考下
    2023-12-12
  • kafka中節(jié)點(diǎn)實(shí)現(xiàn)服役和退役方式

    kafka中節(jié)點(diǎn)實(shí)現(xiàn)服役和退役方式

    本文詳細(xì)描述了如何在Kafka集群中進(jìn)行節(jié)點(diǎn)的服役和退役操作,包括節(jié)點(diǎn)準(zhǔn)備、負(fù)載均衡計(jì)劃的創(chuàng)建與執(zhí)行、以及驗(yàn)證副本存儲(chǔ)計(jì)劃等步驟
    2025-11-11
  • Java幾種分布式全局唯一ID生成方案

    Java幾種分布式全局唯一ID生成方案

    本文主要介紹了聊聊幾種分布式全局唯一ID生成方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 寫了兩年代碼之后再來(lái)談一談Spring中的Bean

    寫了兩年代碼之后再來(lái)談一談Spring中的Bean

    這篇文章主要介紹了寫了兩年代碼之后再來(lái)看看Spring中的Bean,這里列出四種常用的添加Bean的方式,介紹最基本的@Bean注解,@Bean注解聲明這個(gè)類是一個(gè)Bean,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

康保县| 余庆县| 女性| 弥勒县| 金堂县| 托克托县| 长兴县| 茌平县| 福安市| 时尚| 乌什县| 子长县| 五家渠市| 清涧县| 宜丰县| 卢龙县| 新化县| 海宁市| 普安县| 扎赉特旗| 东乡族自治县| 巴彦县| 屏山县| 延庆县| 荣成市| 福贡县| 和顺县| 宁陵县| 永善县| 山东| 克山县| 宜昌市| 黄平县| 新闻| 江阴市| 潮安县| 白银市| 龙泉市| 恩施市| 宁陕县| 莒南县|