日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Java中的Volatile到底是什么?

來源: 責(zé)編: 時(shí)間:2023-10-13 14:37:48 263觀看
導(dǎo)讀圖片volatile是什么?"volatile"是一個(gè)關(guān)鍵字,用于修飾變量。它的作用是告訴編譯器該變量可能會(huì)在意料之外的時(shí)候被修改,因此編譯器在對(duì)該變量進(jìn)行優(yōu)化時(shí)需要特別小心。具體來說,當(dāng)一個(gè)變量被聲明為"volatile"時(shí),編譯器會(huì)禁

圖片圖片Mbx28資訊網(wǎng)——每日最新資訊28at.com

volatile是什么?

"volatile"是一個(gè)關(guān)鍵字,用于修飾變量。它的作用是告訴編譯器該變量可能會(huì)在意料之外的時(shí)候被修改,因此編譯器在對(duì)該變量進(jìn)行優(yōu)化時(shí)需要特別小心。Mbx28資訊網(wǎng)——每日最新資訊28at.com

具體來說,當(dāng)一個(gè)變量被聲明為"volatile"時(shí),編譯器會(huì)禁止對(duì)該變量進(jìn)行某些優(yōu)化,以確保每次訪問該變量時(shí)都會(huì)從內(nèi)存中讀取最新的值,而不是使用之前緩存的值。這對(duì)于多線程編程或者與硬件交互的程序非常重要,因?yàn)樵谶@些情況下,變量的值可能會(huì)被其他線程或者硬件設(shè)備修改。Mbx28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,"volatile"關(guān)鍵字只能保證變量的可見性,不能保證原子性。如果需要保證原子性,還需要使用其他的同步機(jī)制,比如互斥鎖或原子操作。Mbx28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)起來,"volatile"關(guān)鍵字用于修飾變量,告訴編譯器該變量可能會(huì)在意料之外的時(shí)候被修改,從而禁止對(duì)該變量進(jìn)行某些優(yōu)化,確保每次訪問變量時(shí)都會(huì)從內(nèi)存中讀取最新的值。Mbx28資訊網(wǎng)——每日最新資訊28at.com

在Java中,關(guān)鍵字volatile用于修飾變量,用來確保多個(gè)線程之間對(duì)該變量的可見性和順序性。Mbx28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)一個(gè)變量被聲明為volatile時(shí),它的值將會(huì)被存儲(chǔ)在主內(nèi)存中,而不是線程的本地內(nèi)存中。這樣,當(dāng)一個(gè)線程修改了該變量的值時(shí),其他線程可以立即看到最新的值,而不是使用本地緩存中的舊值。Mbx28資訊網(wǎng)——每日最新資訊28at.com

此外,volatile關(guān)鍵字還可以防止指令重排序,即保證了對(duì)該變量的操作按照代碼的順序執(zhí)行,不會(huì)發(fā)生亂序執(zhí)行的情況。Mbx28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,volatile關(guān)鍵字只能保證可見性和順序性,并不能保證原子性。如果需要保證原子性,可以考慮使用synchronized關(guān)鍵字或java.util.concurrent.atomic包中的原子類。Mbx28資訊網(wǎng)——每日最新資訊28at.com

volatile作用

在Java中,volatile的作用是確保多個(gè)線程之間對(duì)該變量的可見性和有序性。具體來說,volatile的作用有以下幾點(diǎn):Mbx28資訊網(wǎng)——每日最新資訊28at.com

  1. 可見性:當(dāng)一個(gè)線程修改了volatile修飾的變量的值時(shí),其他線程能夠立即看到最新的值。這是因?yàn)関olatile修飾的變量會(huì)被存儲(chǔ)在主內(nèi)存中,而不是線程的本地緩存中,從而保證了可見性。
  2. 有序性:volatile修飾的變量的讀寫操作具有順序性。也就是說,當(dāng)一個(gè)線程對(duì)volatile變量進(jìn)行寫操作后,其他線程在讀取該變量時(shí),會(huì)按照寫操作的順序來讀取,不會(huì)出現(xiàn)亂序的情況。

volatile關(guān)鍵字在多線程編程中起到了重要的作用,可以用來確保變量的可見性和有序性,從而避免了由于線程間的競(jìng)爭(zhēng)而引發(fā)的一些問題。Mbx28資訊網(wǎng)——每日最新資訊28at.com

原子性

原子性是指一個(gè)操作要么完全執(zhí)行,要么完全不執(zhí)行,不會(huì)出現(xiàn)部分執(zhí)行的情況。原子性是并發(fā)編程中的一個(gè)重要概念,用于確保多個(gè)線程或進(jìn)程之間的操作不會(huì)相互干擾。Mbx28資訊網(wǎng)——每日最新資訊28at.com

在并發(fā)編程中,多個(gè)線程或進(jìn)程可能同時(shí)訪問共享資源,如果沒有保證原子性,就可能導(dǎo)致數(shù)據(jù)不一致或競(jìng)態(tài)條件等問題。為了保證原子性,可以使用鎖、互斥量、原子操作等機(jī)制來控制對(duì)共享資源的訪問。Mbx28資訊網(wǎng)——每日最新資訊28at.com

在數(shù)據(jù)庫(kù)中,原子性也是一個(gè)重要的概念。原子性要求數(shù)據(jù)庫(kù)的操作要么全部執(zhí)行成功,要么全部不執(zhí)行,不會(huì)出現(xiàn)部分執(zhí)行的情況。數(shù)據(jù)庫(kù)中的事務(wù)就是為了保證原子性而設(shè)計(jì)的,事務(wù)可以將一組操作作為一個(gè)不可分割的單元進(jìn)行執(zhí)行,要么全部執(zhí)行成功,要么全部回滾。Mbx28資訊網(wǎng)——每日最新資訊28at.com

可見性

在計(jì)算機(jī)科學(xué)中,可見性通常指的是在多線程或并發(fā)編程中,一個(gè)線程對(duì)于其他線程的操作是否可見。可見性問題是由于多線程的執(zhí)行順序不確定性而引起的,當(dāng)一個(gè)線程對(duì)共享變量進(jìn)行修改后,其他線程可能無法立即看到這個(gè)修改,導(dǎo)致數(shù)據(jù)不一致或錯(cuò)誤的結(jié)果。Mbx28資訊網(wǎng)——每日最新資訊28at.com

有序性

為了提高程序的執(zhí)行效率,編譯器對(duì)編譯后的指令進(jìn)行重排序,即代碼的編寫順序不一定就是代碼的執(zhí)行順序。Mbx28資訊網(wǎng)——每日最新資訊28at.com

并發(fā)編程只有同時(shí)滿足這三大特性,才能保證程序正確的執(zhí)行,而volatile只保證了可見性和有序性,不保證原子性。Mbx28資訊網(wǎng)——每日最新資訊28at.com

volatile的作用只有兩個(gè)

  • 保存內(nèi)存的可見性
  • 禁止JVM內(nèi)存重排序(保證有序性)

在并發(fā)多線程情況下,為什么會(huì)有可見性問題?如果不做控制,為什么一個(gè)線程修改了共享變量的值,其他線程不能立即看到。這里就需要了解JMM(JAVA內(nèi)存模型,JAVA memory model)Mbx28資訊網(wǎng)——每日最新資訊28at.com

由于JAVA共享變量是存儲(chǔ)在主內(nèi)存中,而JAVA線程是無法直接訪問主內(nèi)存數(shù)據(jù),只能把主內(nèi)存的數(shù)據(jù)拷貝一份副本,修改完本地內(nèi)存的數(shù)據(jù),再寫回主內(nèi)存,而此時(shí)另一個(gè)線程也把主內(nèi)存的數(shù)據(jù)拷貝到自己私有的本地內(nèi)存中,雖然線程1已經(jīng)修改了主內(nèi)存數(shù)據(jù),但線程2卻無法感知到,所以就出現(xiàn)了內(nèi)存可見性問題。Mbx28資訊網(wǎng)——每日最新資訊28at.com

可見性實(shí)現(xiàn)原理

當(dāng)一個(gè)共享變量聲明為volatile后,會(huì)有以下效果:Mbx28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)寫一個(gè)volatile變量時(shí),JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的變量強(qiáng)制刷新到主內(nèi)存中去。
  • 這個(gè)寫回操作會(huì)導(dǎo)致其他線程的緩存無效。

(volatile主要通過匯編lock前綴指令,它會(huì)鎖定當(dāng)前內(nèi)存區(qū)域的緩存行,并且立即將當(dāng)前緩存行數(shù)據(jù)寫入到主內(nèi)存中耗時(shí)非常短),回寫主內(nèi)存的時(shí)候會(huì)通過MESI協(xié)議使其他線程緩存了該變量的地址失效,從而導(dǎo)致其他線程需要去主內(nèi)存中重新讀取數(shù)據(jù)到工作線程中。)Mbx28資訊網(wǎng)——每日最新資訊28at.com

有序性保證的原理:它是通過插入內(nèi)存屏障,在內(nèi)存屏障前后禁止重排序優(yōu)化,以此實(shí)現(xiàn)有序性。Mbx28資訊網(wǎng)——每日最新資訊28at.com

volatile應(yīng)用場(chǎng)景

它可以保證可見性和有序性,但無法保證原子性,所以它的應(yīng)用場(chǎng)景不如synchronized廣泛,主要有兩個(gè)場(chǎng)景:一個(gè)是做狀態(tài)變量,二是做需要重新賦值的共享對(duì)象。Mbx28資訊網(wǎng)——每日最新資訊28at.com

vloatile與synchronized的區(qū)別

volatile只能修飾變量,而后者可以修飾方法,語(yǔ)句塊。volatile不能保證原子性,而后者是可以保證原子性的。都可以保證可見性,但原理不同,volatile是對(duì)變量加了Lock,而后者使用monitorEnter和monitorExit。volatile不會(huì)引起阻塞,而后者會(huì)。在一些場(chǎng)景下使用volatile性能是要更好地。Mbx28資訊網(wǎng)——每日最新資訊28at.com

volatile使用條件

對(duì)變量的寫操作不依賴當(dāng)前值:比如i++操作,變量的寫操作依賴安全值,所以不能保證線程安全。該變量沒有包含在具有其他變量的不變式中。比如i<value,即使i變量聲明為volatile,也不能保證線程安全,因?yàn)関alue可能在運(yùn)行時(shí)候的判斷發(fā)生變化。Mbx28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-13581-0.htmlJava中的Volatile到底是什么?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入探索Elasticsearch:高級(jí)查詢技巧與性能優(yōu)化策略

下一篇: 面試中如何答好:ReentrantLock

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 汾西县| 滦平县| 垣曲县| 马尔康县| 绥棱县| 花垣县| 文成县| 增城市| 清新县| 灵璧县| 方山县| 商丘市| 福州市| 称多县| 武清区| 洪江市| 湖南省| 榆社县| 泗洪县| 东丽区| 迭部县| 张家港市| 东明县| 靖安县| 林州市| 建瓯市| 五家渠市| 芦山县| 边坝县| 西乌珠穆沁旗| 家居| 当阳市| 浙江省| 平原县| 乐平市| 丹巴县| 永平县| 原平市| 咸阳市| 六枝特区| 九龙县|