国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java中volatile關鍵字的含義

2019-11-06 07:38:50
字體:
來源:轉載
供稿:網友

詳見:

http://www.cnblogs.com/zhengbin/p/5654805.html

http://blog.csdn.net/zhanghongjie0302/article/details/51445986

可見性,是指線程之間的可見性,一個線程修改的狀態對另一個線程是可見的。也就是一個線程修改的結果。另一個線程馬上就能看到。比如:用volatile修飾的變量,就會具有可見性。volatile修飾的變量不允許線程內部緩存和重排序,即直接修改內存。所以對其他線程是可見的。但是這里需要注意一個問題,volatile只能讓被他修飾內容具有可見性,但不能保證它具有原子性。比如 volatile int a = 0;之后有一個操作 a++;這個變量a具有可見性,但是a++ 依然是一個非原子操作,也就是這個操作同樣存在線程安全問題。

原子性:

  原子是世界上的最小單位,具有不可分割性。比如 a=0;(a非long和double類型) 這個操作是不可分割的,那么我們說這個操作時原子操作。再比如:a++; 這個操作實際是a = a + 1;是可分割的,所以他不是一個原子操作。非原子操作都會存在線程安全問題,需要我們使用同步技術(sychronized)來讓它變成一個原子操作。一個操作是原子操作,那么我們稱它具有原子性。java的concurrent包下提供了一些原子類,我們可以通過閱讀API來了解這些原子類的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

volatile與synchronized的區別

volatile讓變量每次在使用的時候,都從主存中取。而不是從各個線程的“工作內存”。

volatile具有synchronized關鍵字的“可見性”,但是沒有synchronized關鍵字的“并發正確性”,也就是說不保證線程執行的有序性。

volatile是輕量級的synchronized

Volatile原理


  Java語言提供了一種稍弱的同步機制,即volatile變量,用來確保將變量的更新操作通知到其他線程。當把變量聲明為volatile類型后,編譯器與運行時都會注意到這個變量是共享的,因此不會將該變量上的操作與其他內存操作一起重排序。volatile變量不會被緩存在寄存器或者對其他處理器不可見的地方,因此在讀取volatile類型的變量時總會返回最新寫入的值。

  在訪問volatile變量時不會執行加鎖操作,因此也就不會使執行線程阻塞,因此volatile變量是一種比sychronized關鍵字更輕量級的同步機制。

  當對非volatile變量進行讀寫的時候,每個線程先從內存拷貝變量到CPU緩存中。如果計算機有多個CPU,每個線程可能在不同的CPU上被處理,這意味著每個線程可以拷貝到不同的CPU cache中。

  而聲明變量是volatile的,JVM保證了每次讀變量都從內存中讀,跳過CPU cache這一步。

  當一個變量定義為volatile之后,將具備兩種特性:

  1.保證此變量對所有的線程的可見性,這里的“可見性”,如本文開頭所述,當一個線程修改了這個變量的值,新值對于其他線程是立即得知的。但普通變量做不到這點,普通變量的值在線程間傳遞均需要通過主內存(詳見:Java內存模型)來完成。

  2.禁止指令重排序優化。有volatile修飾的變量,賦值后多執行了一個“load addl $0x0, (%esp)”操作,這個操作相當于一個內存屏障(指令重排序時不能把后面的指令重排序到內存屏障之前的位置),只有一個CPU訪問內存時,并不需要內存屏障;(什么是指令重排序:是指CPU采用了允許將多條指令不按程序規定的順序分開發送給各相應電路單元處理)。


上一篇:Java網絡編程

下一篇:java異常的細節

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡族自治县| 航空| 罗平县| 吴忠市| 明光市| 土默特左旗| 南川市| 博客| 清徐县| 汉源县| 江门市| 梁平县| 栾川县| 黎川县| 四平市| 修水县| 武乡县| 称多县| 新民市| 呼伦贝尔市| 久治县| 云安县| 浦北县| 囊谦县| 饶河县| 炎陵县| 天全县| 通化市| 和平区| 肃北| 永宁县| 闽清县| 玉林市| 正镶白旗| 肃宁县| 恩平市| 罗定市| 岗巴县| 江华| 宁陕县| 洪江市|