Java 並發編程——volatile/synchronized

來源:互聯網
上載者:User

標籤:ola   auto   總結   記憶體模型   mem   mode   還需要   邏輯   png   

一、Java並發基礎

          當一個對象或變數可以被多個線程共用的時候,就有可能使得程式的邏輯出現問題。 在一個對象中有一個變數i=0,有兩個線程A,B都想對i加1,這個時候便有問題顯現出來,關鍵就是對i加1的這個過程不是原子操作。要想對i進行遞增,第一步就是擷取i的值,當A擷取i的值為0,在A將新的值寫入A之前,B也擷取了A的值0,然後A寫入,i變成1,然後B也寫入i,i這個時候依然是1. 當然java的記憶體模型沒有上面這麼簡單,在Java Memory Model中,Memory分為兩類,main memory和working memory,main memory為所有線程共用,working memory中存放的是線程所需要的變數的拷貝(線程要對main memory中的內容進行操作的話,首先需要拷貝到自己的working memory,一般為了速度,working memory一般是在cpu的cache中的)。被volatile修飾的變數在被操作的時候不會產生working memory的拷貝,而是直接操作main memory,當然volatile雖然解決了變數的可見度問題,但沒有解決變數操作的原子性的問題,這個還需要synchronized或者CAS相關操作配合進行。

在介紹這兩個並發編程中常用的關鍵字之前,先介紹兩個概念:可見度、原子性  

可見度:它必須確保釋放鎖之前對共用資料做出的更改對於隨後獲得該鎖的另一個線程是可見的。一旦某個線程修改了該被volatile修飾的變數,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,可以立即擷取修改之後的值。對於普通變數:讀操作會優先讀取工作記憶體的資料,如果工作記憶體中不存在,則從主記憶體中拷貝一份資料到工作記憶體中;寫操作只會修改工作記憶體的副本資料,這種情況下,其它線程就無法讀取變數的最新值。對於volatile變數,讀操作時JMM會把工作記憶體中對應的值設為無效,要求線程從主記憶體中讀取資料;寫操作時JMM會把工作記憶體中對應的資料重新整理到主記憶體中,這種情況下,其它線程就可以讀取變數的最新值。

使用volatile關鍵字僅能實現對原始變數(如boolen、 short 、int 、long等)操作的原子性,但需要特別注意, volatile不能保證複合操作的原子性,即使只是i++,實際上也是由多個原子操作組成:read i; inc; write i,假如多個線程同時執行i++volatile只能保證他們操作的i是同一塊記憶體,但依然可能出現寫入髒資料的情況。

原子性: 要麼不執行,要麼執行到底。原子性就是當某一個線程修改i的值的時候,從取出i到將新的i的值寫給i之間不能有其他線程對i進行任何操作。也就是說保證某個線程對i的操作是原子性的,這樣就可以避免資料髒讀。 通過鎖機制或者CAS(Compare And Set 需要硬體CPU的支援)操作可以保證操作的原子性。


總結:

  1. volatile本質是在告訴jvm當前變數在寄存器(工作記憶體)中的值是不確定的,需要從主存中讀取; synchronized則是鎖定當前變數,只有當前線程可以訪問該變數,其他線程被阻塞住。
  2. volatile僅能使用在變數層級;synchronized則可以使用在變數、方法、和類層級的
  3. volatile僅能實現變數的修改可見度,不能保證原子性;而synchronized則可以保證變數的修改可見度和原子性
  4. volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。
  5. volatile標記的變數不會被編譯器最佳化;synchronized標記的變數可以被編譯器最佳化

參考:

http://blog.csdn.net/suifeng3051/article/details/52611233

https://www.jianshu.com/p/beb2c98003c4

Java 並發編程——volatile/synchronized

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.