91精产品自偷自偷综合官网版下载-91精产品自偷自偷综合下-91精品-91精品91久久久-91精品成人-91精品成人www

網站建設資訊

NEWS

網站建設資訊

Java內存模型和volatile關鍵字怎么掌握

這篇文章主要講解了“Java內存模型和volatile關鍵字怎么掌握”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java內存模型和volatile關鍵字怎么掌握”吧!

成都創新互聯2013年開創至今,先為香坊等服務建站,香坊等地企業,進行企業商務咨詢服務。為香坊企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

java內存模型(JMM):

相關概念:
	1)在命令式編程中,線程之間的通信機制有兩種:共享內存和消息傳遞。
	2)java的并發采用的是共享內存模型:通過讀/寫內存中的公共狀態進行隱式通信。

概念:java線程之間的通信是由java內存模型控制的,JMM決定一個線程對共享變量的寫入何時對另一個線程可見。

說明:
	1>線程之間的共享變量存儲在主內存中,每個線程都有一個私有的工作內存,工作內存中存儲了該線程讀/寫共享變量的副本。
	2>工作內存是JMM的一個抽象概念,并不真實存在。它涵蓋了緩存、寫緩沖區、寄存器以及其他的硬件和編譯器優化。
	3>線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,而不能直接讀寫主內存中的變量。
	4>不同的線程之間也無法直接訪問對方工作內存中的變量,線程間變量值的傳遞均需要通過主內存來完成。

volatile關鍵字:

相關概念:
	緩存行:緩存器中可以分配的最小存儲單位。
	L1緩存:內部緩存。
	L2緩存:外部緩存。

原理:
	1)為了提高處理速度,處理器不直接和內存進行通信,而是先將系統內存中的數據讀到緩存(L1、L2)后再進行操作,但操作完成后,處理器是不知道何時要把操作后的數據寫回到內存中。
	2)對volatile修飾的變量進行寫操作時,JVM會向處理器發送一條Lock前綴的指令,將這個變量所在緩存行(即JMM中的工作內存)的數據寫回到系統內存中,并且將其它CPU里緩存了該內存地址的數據無效。
	補充:
		1>對volatile修飾的變量進行寫操作(賦值)時,在JIT編譯器生成的匯編指令中,我們會發現有一個以Lock為前綴的指令。
		2>以Lock為前綴的指令在多核處理器下會引發了兩件事情:①將當前處理器緩存行的數據寫回到系統內存中 ②這個寫回內存的操作會導致其它CPU里緩存了該內存地址的數據無效。
	
	volatile的內存原語:
		當讀一個volatile變量時,JMM會把該線程對應的工作內存置為無效,線程接下來將從主內存中讀取共享變量。
		當寫一個volatile變量時,JMM會把該線程對應的工作內存中的共享變量值刷新到主內存。
	即:
		1將本地內存中的數據設置為無效,  
		2從主內存中將數據復制到本地內存中,  
		3在本地內存中進行操作,  
		4操作完成后將本地內存中的數據刷新到主內存中。整體看起來就像是直接在主內存中操作一樣。  
		
	
說明:
	用volatile修飾的變量如果被一個線程更改了,那么其它的線程都會立即感知,并且每個線程獲取該變量的值都是最新的值,訪問volatile修飾的變量看起來就像是直接在內存中讀寫一樣。
	
特性:
	可見性:對一個volatile變量的讀,(任意線程)總是能看到對這個volatile變量最后的寫入。
	原子性:對一個volatile變量的讀/寫具有原子性,但類似于volatile++這種復合操作不具有原子性。			

優點:
	不會引起線程上下文的切換

	
volatile與synchronized的比較:
	1)關鍵字volatile只能修飾變量,synchronized可以修飾代碼塊、方法
	2)volatile不能保證原子性,synchronized保證原子性:
		volatile可以保證數據的可見性,但是不能保證原子性,所以volatile解決的是變量在多線程之間的可見性;
		synchronized可以保證原子性,也保證了可見性(synchronized會將私有內存和公共內存中的數據做同步),所以synchronized解決的是多線程之間訪問資源的同步性。

重排序:

說明:在執行程序時,為了提高性能,編譯器和處理器常常會對指令做重排序。

重排序分2種類型:

	1)編譯器重排序:編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序。
	2)處理器重排序:
		1>指令級并行的重排序:現代處理器采用了指令級并行技術來將多條指令重疊執行。如果不存在數據依賴性,處理器可以改變語句對應機器指令的執行順序。
		2>內存系統的重排序:  由于處理器使用緩存和讀/寫緩沖區,這使得加載和存儲操作看上去可能是在亂序執行。


JMM如何實現volatile寫/讀的內存語義:

	1)JMM針對編譯器制定的volatile重排序規則:
	
		兩個操作間重排序的條件:
			1>當第一個操作是volatile讀,不管第二個操作是什么,都不能重排序。這個規則確保volatile讀之后的操作不會被編譯器重排序到volatile讀之前。
			2>當第二個操作是volatile寫,不管第一個操作是什么,都不能重排序。這個規則確保volatile寫之前的操作不會被編譯器重排序到volatile寫之后。
			3>當第一個操作是volatile寫,第二個操作是volatile讀時,不能重排序。
		
			由以上3點可以得出結論:兩個volatile變量操作不能夠進行重排序。
		
	2)為了實現volatile的內存語義,編譯器在生成字節碼時,會在指令序列中插入內存屏障來禁止特定類型的處理器重排序。(內存屏障:將前面操作的共享變量值刷新到主內存中。)

感謝各位的閱讀,以上就是“Java內存模型和volatile關鍵字怎么掌握”的內容了,經過本文的學習后,相信大家對Java內存模型和volatile關鍵字怎么掌握這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!


網頁名稱:Java內存模型和volatile關鍵字怎么掌握
分享URL:http://www.yuzhuanjia.cn/article/gishpj.html
主站蜘蛛池模板: 91久久精品一区二区三 | 午夜福利伦理电影 | 午夜视频在线观看国产 | 丁香六月综合网 | 午夜电影在线观 | 国产按摩推油一区二区三区在线 | 成全世界免费高清观看 | 91久久大香伊蕉在人线 | 99久久久久国产精品专区无码 | 91精品国产高清91久久久 | 福利视频一区二区牛牛 | 91精品国产情侣高潮露脸酒店 | www亚洲精| 99精品免费视频在 | 成人深夜www视频免费软件 | 97无码视频在 | 99视频精品 | 日韩av毛片精品久久 | av无码在线免费观看 | 成人福利 | 91久久国产露脸精品国产 | 日韩av高清电影免费在线观看 | 午夜小视频男女在线观看 | 高清成人爽a毛片免费直播 高清成人爽a毛片在线播放 | AV国产AV亚洲AV天堂 | 东京道一本热中文字幕 | 丰满人妻中伦妇伦精品app | 国产91在线午夜小电 | 91在线无码精品秘蜜桃 | 被教官按在寝室狂到腿软视频 | 波多野结衣a∨免费观看 | 丰满少妇大乳高潮在线 | 国产播放隔着超薄丝袜进入 | 午夜三级a三 | 99久久精品少妇高潮喷水 | 99久久婷婷国产自综合青草 | 91夜色视频| 91大神精品视频 | 91极品女神嫩模在线播放 | 国产av中文| 东京熟一级片集 |