摘要:多線程主要就是圍繞可見性和原子性這兩個特性展開的,關鍵字對應著可見性,但很多時候人們誤以為使用了關鍵字后編寫多線程就沒問題了,不知道它不能保證原子性。
說起volatile和sychronized這兩個關鍵字,學習過多線程的同學應該都很熟悉,在jdk1.5之前,主要就是靠這兩個關鍵字來做多線程編程的,但在jdk1.5以后,多了一個java.util.concurrent(JUC)包,里面包含了很多工具類用于多線程編程。但今天的重點還是講講volatile關鍵字。
多線程主要就是圍繞可見性和原子性這兩個特性展開的,volatile關鍵字對應著可見性,但很多時候人們誤以為使用了volatile關鍵字后編寫多線程就沒問題了,不知道它不能保證原子性。
首先來說說什么是可見性?要說到可見性,就得扯到java內(nèi)存模型了,暫且不做太多展開,簡單理解下就是,現(xiàn)在技術的提升,使得cpu的核心數(shù)不斷增多,而每個核心又擁有自己的緩存,當處理數(shù)據(jù)時會有以下幾個步驟:
將數(shù)據(jù)從內(nèi)存讀取到緩存中
在緩存中對數(shù)據(jù)進行操作
將緩存中的數(shù)據(jù)寫入內(nèi)存中
步驟2中的操作并不是原子性,也就是在步驟1之后,如果主內(nèi)存變量發(fā)生修改之后,線程工作內(nèi)存中的值由于已經(jīng)加載,不會產(chǎn)生對應的變化,所以計算出來的結(jié)果會和預期不一樣
對于volatile修飾的變量,jvm虛擬機只是保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的
正是因為這幾個步驟的存在,往往別的核心從內(nèi)存中讀取到的數(shù)據(jù)不是最新的,這就造成了數(shù)據(jù)錯誤。java為了屏蔽操作系統(tǒng)以及硬件之間的不同,在jvm中虛擬出了一套內(nèi)存模型,編碼時使用volatile關鍵字對需要實時可見的數(shù)據(jù)修飾,在jvm底層會對該變量做特定的處理。
總結(jié)下可見性就是當多個線程操作共享數(shù)據(jù)時,保證操作的數(shù)據(jù)是最新的。
volatile關鍵字的作用?剛也說過volatile關鍵字對應的可見性,但這是其中之一,它有兩個作用:
1)使用volatile關鍵字修飾的變量,保證了其在多線程之間的可見性,即每次讀取到volatile變量,一定是最新的數(shù)據(jù)
2)代碼底層執(zhí)行不像我們看到的高級語言—-Java程序這么簡單,它的執(zhí)行是Java代碼–>字節(jié)碼–>根據(jù)字節(jié)碼執(zhí)行對應的C/C++代碼–>C/C++代碼被編譯成匯編語言–>和硬件電路交互,現(xiàn)實中,為了獲取更好的性能JVM可能會對指令進行重排序,多線程下可能會出現(xiàn)一些意想不到的問題。使用volatile則會對禁止語義重排序,當然這也一定程度上降低了代碼執(zhí)行效率
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67732.html
摘要:三關鍵字能保證原子性嗎并發(fā)編程藝術這本書上說保證但是在自增操作非原子操作上不保證,多線程編程核心藝術這本書說不保證。多線程訪問關鍵字不會發(fā)生阻塞,而關鍵字可能會發(fā)生阻塞關鍵字能保證數(shù)據(jù)的可見性,但不能保證數(shù)據(jù)的原子性。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)synchroniz...
摘要:當一個線程持有重量級鎖時,另外一個線程就會被直接踢到同步隊列中等待。 java代碼先編譯成字節(jié)碼,字節(jié)碼最后編譯成cpu指令,因此Java的多線程實現(xiàn)最終依賴于jvm和cpu的實現(xiàn) synchronized和volatile 我們先來討論一下volatile關鍵字的作用以及實現(xiàn)機制,每個線程看到的用volatile修飾的變量的值都是最新的,更深入的解釋就涉及到Java的內(nèi)存模型了,我們...
摘要:所以多線程條件下使用關鍵字的前提是對變量的寫操作不依賴于變量的當前值,而賦值操作很明顯滿足這一前提。在多線程環(huán)境下,正確使用關鍵字可以比直接使用更加高效而且代碼簡潔,但是使用關鍵字也更容易出錯。 volatile 作為 Java 語言的一個關鍵字,被看作是輕量級的 synchronized(鎖)。雖然 volatile 只具有synchronized 的部分功能,但是一般使用 vola...
摘要:今天開始整理學習多線程的知識,談談最重要的兩個關鍵字和。但是這樣一個過程比較慢,在使用多線程的時候就會出現(xiàn)問題。有序性有序性是指多線程執(zhí)行結(jié)果的正確性。這種機制在多線程中會出現(xiàn)問題,因此可以通過來禁止重排。 今天開始整理學習多線程的知識,談談最重要的兩個關鍵字:volatile和synchronized。 一、三個特性 1、原子性 所謂原子性操作就是指這些操作是不可中斷的,要么執(zhí)行過程...
時間:2017年07月09日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程簡介 1-1 課程簡介 課程目標和學習內(nèi)容 共享變量在線程間的可見性 synchronized實現(xiàn)可見性 volatile實現(xiàn)可見性 指令重排序 as-if-seria...
閱讀 3340·2021-11-19 11:36
閱讀 2944·2021-09-27 13:34
閱讀 2005·2021-09-22 15:17
閱讀 2414·2019-08-30 13:49
閱讀 765·2019-08-26 13:58
閱讀 1366·2019-08-26 10:47
閱讀 2547·2019-08-23 18:05
閱讀 607·2019-08-23 14:25