JAVA的原子性和可見度,線程同步的理解

來源:互聯網
上載者:User

標籤:double   比較   add   不同   代碼最佳化   多線程   過程   很多   共用記憶體   

1、原子性

 

(1)原子是構成物質的基本單位(當然電子等暫且不論),所以原子的意思代表著——“不可分”;

(2)原子性是拒絕多線程操作的,不論是多核還是單核,具有原子性的量,同一時刻只能有一個線程來對它進行操作。簡而言之,在整個操作過程中不會被線程調度器中斷的操作,都可認為是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。

 2、非原子性

  (1)也就是整個過程中會出現線程調度器中斷操作的現象,例如:

類似"a += b"這樣的操作不具有原子性,在某些JVM中"a += b"可能要經過這樣三個步驟:

 

(1)取出a和b

(2)計算a+b

(3)將計算結果寫入記憶體

如果有兩個線程t1,t2在進行這樣的操作。t1在第二步做完之後還沒來得及把資料寫回記憶體就被線程調度器中斷了,於是t2開始執行,t2執行完畢後t1又把沒有完成的第三步做完。這個時候就出現了錯誤,相當於t2的計算結果被無視掉了。所以上面的買碘片例子在同步add方法之前,實際結果總是小於預期結果的,因為很多操作都被無視掉了。

類似的,像"a++"這樣的操作也都不具有原子性。所以在多線程的環境下一定要記得進行同步操作。

 

3、可見度

  可見度volatile修飾詞,可以應對多線程同時訪問修改同一變數,由於相互的不可見度所帶來的不可預期的結果,存在二義性的現象,出現的。

 多線程變數不可見:當一個線程對一變數a修改後,還沒有來得及將修改後的a值回寫到主存,而被線程調度器中斷操作(或收回時間片),然後讓另一線程進行對a變數的訪問修改,這時候,後來的線程並不知道a值已經修改過,它使用的仍舊是修改之前的a值,這樣修改後的a值就被另一線程覆蓋掉了。

多線程變數可見:被volatile修飾的成員變數在每次被線程訪問時,都強迫從記憶體中重讀該成員變數的值;而且,當成員變數發生變化時,強迫線程將變化值回寫到共用記憶體,這樣在任何時刻兩個不同線程總是看到某一成員變數的同一個值,這就是保證了可見度。

volatile使用情境:在兩個或者更多的線程訪問的成員變數上使用volatile。當要訪問的變數已在synchronized代碼塊中,或者為常量時,不必使用。
由於使用volatile屏蔽掉了JVM中必要的代碼最佳化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。
注意:

如果給一個變數加上volatile修飾符,就相當於:每一個線程中一旦這個值發生了變化就馬上重新整理回主存,使得各個線程取出的值相同。編譯器不要對這個變數的讀、寫操作做最佳化。但是值得注意的是,除了對long和double的簡單操作之外,volatile並不能提供原子性。所以,就算你將一個變數修飾為volatile,但是對這個變數的操作並不是原子的,在並發環境下,還是不能避免錯誤的發生!

4、synchronized

 

         synchronized為一段操作或記憶體進行加鎖,它具有互斥性。當線程要操作被synchronized修飾的記憶體或操作時,必須首先獲得鎖才能進行後續操作;但是在同一時刻只能有一個線程獲得相同的一把鎖(對象監視器),所以它只允許一個線程進行操作。

JAVA的原子性和可見度,線程同步的理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.