成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的Volatile到底是什么?

開發(fā) 前端
volatile只能修飾變量,而后者可以修飾方法,語句塊。volatile不能保證原子性,而后者是可以保證原子性的。都可以保證可見性,但原理不同,volatile是對變量加了Lock,而后者使用monitorEnter和monitorExit。volatile不會引起阻塞,而后者會。在一些場景下使用volatile性能是要更好地。

圖片圖片

volatile是什么?

"volatile"是一個關鍵字,用于修飾變量。它的作用是告訴編譯器該變量可能會在意料之外的時候被修改,因此編譯器在對該變量進行優(yōu)化時需要特別小心。

具體來說,當一個變量被聲明為"volatile"時,編譯器會禁止對該變量進行某些優(yōu)化,以確保每次訪問該變量時都會從內(nèi)存中讀取最新的值,而不是使用之前緩存的值。這對于多線程編程或者與硬件交互的程序非常重要,因為在這些情況下,變量的值可能會被其他線程或者硬件設備修改。

需要注意的是,"volatile"關鍵字只能保證變量的可見性,不能保證原子性。如果需要保證原子性,還需要使用其他的同步機制,比如互斥鎖或原子操作。

總結起來,"volatile"關鍵字用于修飾變量,告訴編譯器該變量可能會在意料之外的時候被修改,從而禁止對該變量進行某些優(yōu)化,確保每次訪問變量時都會從內(nèi)存中讀取最新的值。

在Java中,關鍵字volatile用于修飾變量,用來確保多個線程之間對該變量的可見性和順序性。

當一個變量被聲明為volatile時,它的值將會被存儲在主內(nèi)存中,而不是線程的本地內(nèi)存中。這樣,當一個線程修改了該變量的值時,其他線程可以立即看到最新的值,而不是使用本地緩存中的舊值。

此外,volatile關鍵字還可以防止指令重排序,即保證了對該變量的操作按照代碼的順序執(zhí)行,不會發(fā)生亂序執(zhí)行的情況。

需要注意的是,volatile關鍵字只能保證可見性和順序性,并不能保證原子性。如果需要保證原子性,可以考慮使用synchronized關鍵字或java.util.concurrent.atomic包中的原子類。

volatile作用

在Java中,volatile的作用是確保多個線程之間對該變量的可見性和有序性。具體來說,volatile的作用有以下幾點:

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

volatile關鍵字在多線程編程中起到了重要的作用,可以用來確保變量的可見性和有序性,從而避免了由于線程間的競爭而引發(fā)的一些問題。

原子性

原子性是指一個操作要么完全執(zhí)行,要么完全不執(zhí)行,不會出現(xiàn)部分執(zhí)行的情況。原子性是并發(fā)編程中的一個重要概念,用于確保多個線程或進程之間的操作不會相互干擾。

在并發(fā)編程中,多個線程或進程可能同時訪問共享資源,如果沒有保證原子性,就可能導致數(shù)據(jù)不一致或競態(tài)條件等問題。為了保證原子性,可以使用鎖、互斥量、原子操作等機制來控制對共享資源的訪問。

在數(shù)據(jù)庫中,原子性也是一個重要的概念。原子性要求數(shù)據(jù)庫的操作要么全部執(zhí)行成功,要么全部不執(zhí)行,不會出現(xiàn)部分執(zhí)行的情況。數(shù)據(jù)庫中的事務就是為了保證原子性而設計的,事務可以將一組操作作為一個不可分割的單元進行執(zhí)行,要么全部執(zhí)行成功,要么全部回滾。

可見性

在計算機科學中,可見性通常指的是在多線程或并發(fā)編程中,一個線程對于其他線程的操作是否可見。可見性問題是由于多線程的執(zhí)行順序不確定性而引起的,當一個線程對共享變量進行修改后,其他線程可能無法立即看到這個修改,導致數(shù)據(jù)不一致或錯誤的結果。

有序性

為了提高程序的執(zhí)行效率,編譯器對編譯后的指令進行重排序,即代碼的編寫順序不一定就是代碼的執(zhí)行順序。

并發(fā)編程只有同時滿足這三大特性,才能保證程序正確的執(zhí)行,而volatile只保證了可見性和有序性,不保證原子性。

volatile的作用只有兩個

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

在并發(fā)多線程情況下,為什么會有可見性問題?如果不做控制,為什么一個線程修改了共享變量的值,其他線程不能立即看到。這里就需要了解JMM(JAVA內(nèi)存模型,JAVA memory model)

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

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

當一個共享變量聲明為volatile后,會有以下效果:

  • 當寫一個volatile變量時,JMM會把該線程對應的本地內(nèi)存中的變量強制刷新到主內(nèi)存中去。
  • 這個寫回操作會導致其他線程的緩存無效。

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

有序性保證的原理:它是通過插入內(nèi)存屏障,在內(nèi)存屏障前后禁止重排序優(yōu)化,以此實現(xiàn)有序性。

volatile應用場景

它可以保證可見性和有序性,但無法保證原子性,所以它的應用場景不如synchronized廣泛,主要有兩個場景:一個是做狀態(tài)變量,二是做需要重新賦值的共享對象。

vloatile與synchronized的區(qū)別

volatile只能修飾變量,而后者可以修飾方法,語句塊。volatile不能保證原子性,而后者是可以保證原子性的。都可以保證可見性,但原理不同,volatile是對變量加了Lock,而后者使用monitorEnter和monitorExit。volatile不會引起阻塞,而后者會。在一些場景下使用volatile性能是要更好地。

volatile使用條件

對變量的寫操作不依賴當前值:比如i++操作,變量的寫操作依賴安全值,所以不能保證線程安全。該變量沒有包含在具有其他變量的不變式中。比如i<value,即使i變量聲明為volatile,也不能保證線程安全,因為value可能在運行時候的判斷發(fā)生變化。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2009-06-09 22:11:44

JavaScriptObject

2023-03-29 08:24:46

Rune類型開源項目

2017-07-13 10:43:52

CNNmaxpool池化

2022-10-08 00:00:00

Spring數(shù)據(jù)庫項目

2020-03-05 10:28:19

MySQLMRR磁盤讀

2011-04-27 09:30:48

企業(yè)架構

2020-09-27 06:53:57

MavenCDNwrapper

2020-09-22 08:22:28

快充

2020-10-14 06:22:14

UWB技術感知

2010-11-01 01:25:36

Windows NT

2020-10-12 18:00:39

JavaAQS代碼

2013-06-09 09:47:31

.NetPDBPDB文件

2021-09-03 09:12:09

Linux中斷軟件

2019-10-30 10:13:15

區(qū)塊鏈技術支付寶

2020-08-04 14:20:20

數(shù)據(jù)湖Hadoop數(shù)據(jù)倉庫

2010-04-22 14:14:29

Live-USB

2021-09-01 23:29:37

Golang語言gRPC

2021-01-21 21:24:34

DevOps開發(fā)工具

2021-02-05 10:03:31

區(qū)塊鏈技術智能

2021-07-07 05:07:15

JDKIterator迭代器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产亚洲精品久久久久动 | 亚洲午夜精品视频 | 日韩三片| 日本淫视频 | 久久久久久99| av一区二区三区四区 | 日韩精品成人av | 欧美区在线 | 亚洲欧美综合精品久久成人 | 国产欧美日韩一区 | 亚洲视频一区二区三区 | 精品国产不卡一区二区三区 | 国产成人一区二区三区久久久 | 国产成人久久精品一区二区三区 | 亚洲视频在线免费观看 | 亚洲视频免费 | 成人在线视频免费观看 | 午夜看片| 91在线 | 国产成人免费 | 欧美一区二区小视频 | 欧美成人专区 | 成人欧美一区二区三区在线观看 | www国产成人免费观看视频,深夜成人网 | 亚洲国产成人精品女人久久久 | 国产综合久久久久久鬼色 | av天天爽 | 福利视频大全 | 色综合久久天天综合网 | 亚洲成人午夜电影 | 国产一区二区麻豆 | 久久精品一区二区 | 网色 | 激情av | 超碰3 | 久久黄网| 成人免费在线播放 | 国产精品区二区三区日本 | 91精品国产91久久久久久吃药 | 久久综合影院 | 日韩精品一区二 |