欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

volatile 2個使用場景:

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

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

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

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

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

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

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

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

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

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

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

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

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

  那么在線程2修改stop值時(當(dāng)然這里包括2個操作,修改線程2工作內(nèi)存中的值,然后將修改后的值寫入內(nèi)存),會使得線程1的工作內(nèi)存中緩存變量stop的緩存行無效,然后線程1讀取時,發(fā)現(xiàn)自己的緩存行無效,它會等待緩存行對應(yīng)的主存地址被更新之后,然后去對應(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)鍵字的作用與用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot接入mq的方法示例

    springboot接入mq的方法示例

    本文主要介紹了springboot接入mq的方法示例,主要實(shí)現(xiàn)配置以及實(shí)現(xiàn)一個簡單的發(fā)送、接收消息的例子,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java 遞歸重難點(diǎn)分析詳解與練習(xí)

    Java 遞歸重難點(diǎn)分析詳解與練習(xí)

    一說起遞歸,我想每個人都不陌生。舉個從小就聽過的例子:從前有座山,山里有座廟,廟里有個和尚,和尚在講故事,從前有座山,山里有座廟,廟里有個和尚,和尚在講故事,從前有座山,要理解遞歸,就得先了解什么是遞歸,實(shí)際上這句話就是一個遞歸
    2021-11-11
  • Java集合之LinkedList源碼解析

    Java集合之LinkedList源碼解析

    這篇文章主要介紹了Java集合之LinkedList源碼解析,LinkedList和ArrayList數(shù)據(jù)結(jié)構(gòu)是完全不一樣的,ArrayList 底層是數(shù)組的結(jié)構(gòu),而 LinkedList 的底層則是鏈表的結(jié)構(gòu), 它可以進(jìn)行高效的插入和移除的操作,它基于的是一個雙向鏈表的結(jié)構(gòu),需要的朋友可以參考下
    2023-12-12
  • Java新API的時間格式化

    Java新API的時間格式化

    這篇文章主要介紹了Java新API的時間格式化,新的時間API的時間格式化由java.time.format.DateTimeFormatter負(fù)責(zé),更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot結(jié)合Redis配置工具類實(shí)現(xiàn)動態(tài)切換庫

    SpringBoot結(jié)合Redis配置工具類實(shí)現(xiàn)動態(tài)切換庫

    本文主要介紹了SpringBoot結(jié)合Redis配置工具類實(shí)現(xiàn)動態(tài)切換庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • idea中斷點(diǎn)類型之All和Thread的區(qū)別介紹

    idea中斷點(diǎn)類型之All和Thread的區(qū)別介紹

    使用all模式對于程序中含有多個線程來說,會將多個線程都阻塞在斷點(diǎn),此時所有的線程都執(zhí)行到此處,在最后一個線程執(zhí)行到此處是會發(fā)生暫停,在這之前的線程會繼續(xù)執(zhí)行到任意位置,本文給大家詳細(xì)介紹下idea中斷點(diǎn)類型之All和Thread的區(qū)別,感興趣的朋友一起看看吧
    2022-03-03
  • java:找不到符號報(bào)錯的排錯方案舉例

    java:找不到符號報(bào)錯的排錯方案舉例

    當(dāng)你使用一個未定義或未導(dǎo)入的類時,編譯器會報(bào)錯,下面這篇文章主要給大家介紹了關(guān)于java:找不到符號報(bào)錯的排錯方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實(shí)現(xiàn)代碼

    Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-04-04
  • java實(shí)現(xiàn)九宮格拼圖游戲

    java實(shí)現(xiàn)九宮格拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)九宮格拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 深入理解Java中的final關(guān)鍵字_動力節(jié)點(diǎn)Java學(xué)院整理

    深入理解Java中的final關(guān)鍵字_動力節(jié)點(diǎn)Java學(xué)院整理

    Java中的final關(guān)鍵字非常重要,它可以應(yīng)用于類、方法以及變量。這篇文章中我將帶你看看什么是final關(guān)鍵字以及使用final的好處,具體內(nèi)容詳情通過本文學(xué)習(xí)吧
    2017-04-04

最新評論