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

當前位置:首頁 > 科技  > 軟件

Java中的Volatile到底是什么?

來源: 責編: 時間:2023-10-13 14:37:48 253觀看
導讀圖片volatile是什么?"volatile"是一個關鍵字,用于修飾變量。它的作用是告訴編譯器該變量可能會在意料之外的時候被修改,因此編譯器在對該變量進行優化時需要特別小心。具體來說,當一個變量被聲明為"volatile"時,編譯器會禁

圖片圖片mVv28資訊網——每日最新資訊28at.com

volatile是什么?

"volatile"是一個關鍵字,用于修飾變量。它的作用是告訴編譯器該變量可能會在意料之外的時候被修改,因此編譯器在對該變量進行優化時需要特別小心。mVv28資訊網——每日最新資訊28at.com

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

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

總結起來,"volatile"關鍵字用于修飾變量,告訴編譯器該變量可能會在意料之外的時候被修改,從而禁止對該變量進行某些優化,確保每次訪問變量時都會從內存中讀取最新的值。mVv28資訊網——每日最新資訊28at.com

在Java中,關鍵字volatile用于修飾變量,用來確保多個線程之間對該變量的可見性和順序性。mVv28資訊網——每日最新資訊28at.com

當一個變量被聲明為volatile時,它的值將會被存儲在主內存中,而不是線程的本地內存中。這樣,當一個線程修改了該變量的值時,其他線程可以立即看到最新的值,而不是使用本地緩存中的舊值。mVv28資訊網——每日最新資訊28at.com

此外,volatile關鍵字還可以防止指令重排序,即保證了對該變量的操作按照代碼的順序執行,不會發生亂序執行的情況。mVv28資訊網——每日最新資訊28at.com

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

volatile作用

在Java中,volatile的作用是確保多個線程之間對該變量的可見性和有序性。具體來說,volatile的作用有以下幾點:mVv28資訊網——每日最新資訊28at.com

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

volatile關鍵字在多線程編程中起到了重要的作用,可以用來確保變量的可見性和有序性,從而避免了由于線程間的競爭而引發的一些問題。mVv28資訊網——每日最新資訊28at.com

原子性

原子性是指一個操作要么完全執行,要么完全不執行,不會出現部分執行的情況。原子性是并發編程中的一個重要概念,用于確保多個線程或進程之間的操作不會相互干擾。mVv28資訊網——每日最新資訊28at.com

在并發編程中,多個線程或進程可能同時訪問共享資源,如果沒有保證原子性,就可能導致數據不一致或競態條件等問題。為了保證原子性,可以使用鎖、互斥量、原子操作等機制來控制對共享資源的訪問。mVv28資訊網——每日最新資訊28at.com

在數據庫中,原子性也是一個重要的概念。原子性要求數據庫的操作要么全部執行成功,要么全部不執行,不會出現部分執行的情況。數據庫中的事務就是為了保證原子性而設計的,事務可以將一組操作作為一個不可分割的單元進行執行,要么全部執行成功,要么全部回滾。mVv28資訊網——每日最新資訊28at.com

可見性

在計算機科學中,可見性通常指的是在多線程或并發編程中,一個線程對于其他線程的操作是否可見。可見性問題是由于多線程的執行順序不確定性而引起的,當一個線程對共享變量進行修改后,其他線程可能無法立即看到這個修改,導致數據不一致或錯誤的結果。mVv28資訊網——每日最新資訊28at.com

有序性

為了提高程序的執行效率,編譯器對編譯后的指令進行重排序,即代碼的編寫順序不一定就是代碼的執行順序。mVv28資訊網——每日最新資訊28at.com

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

volatile的作用只有兩個

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

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

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

可見性實現原理

當一個共享變量聲明為volatile后,會有以下效果:mVv28資訊網——每日最新資訊28at.com

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

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

有序性保證的原理:它是通過插入內存屏障,在內存屏障前后禁止重排序優化,以此實現有序性。mVv28資訊網——每日最新資訊28at.com

volatile應用場景

它可以保證可見性和有序性,但無法保證原子性,所以它的應用場景不如synchronized廣泛,主要有兩個場景:一個是做狀態變量,二是做需要重新賦值的共享對象。mVv28資訊網——每日最新資訊28at.com

vloatile與synchronized的區別

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

volatile使用條件

對變量的寫操作不依賴當前值:比如i++操作,變量的寫操作依賴安全值,所以不能保證線程安全。該變量沒有包含在具有其他變量的不變式中。比如i<value,即使i變量聲明為volatile,也不能保證線程安全,因為value可能在運行時候的判斷發生變化。mVv28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入探索Elasticsearch:高級查詢技巧與性能優化策略

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

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 资兴市| 中江县| 铁力市| 乌兰浩特市| 上蔡县| 秭归县| 沂源县| 济南市| 桐梓县| 建宁县| 凤山市| 河间市| 呼伦贝尔市| 宁强县| 道孚县| 香港| 沅江市| 安康市| 诏安县| 白玉县| 会理县| 惠东县| 琼结县| 若羌县| 崇礼县| 呼图壁县| 漠河县| 宁蒗| 家居| 涞水县| 尼勒克县| 桑日县| 平潭县| 黄大仙区| 昌都县| 三门峡市| 昌乐县| 松溪县| 黄陵县| 临海市| 大宁县|