什么是Java中的原子操作( atomic operations)


1.啥是java的原子性

  原子性:即一個操作或者多個操作 要么全部執行並且執行的過程不會被任何因素打斷,要么就都不執行。

 

  一個很經典的例子就是銀行賬戶轉賬問題:

  比如從賬戶A向賬戶B轉1000元,那么必然包括2個操作:從賬戶A減去1000元,往賬戶B加上1000元。

  試想一下,如果這2個操作不具備原子性,會造成什么樣的后果。假如從賬戶A減去1000元之后,操作突然中止。然后又從B取出了500元,取出500元之后,再執行 往賬戶B加上1000元 的操作。這樣就會導致賬戶A雖然減去了1000元,但是賬戶B沒有收到這個轉過來的1000元。

  所以這2個操作必須要具備原子性才能保證不出現一些意外的問題。

 

  同樣地反映到並發編程中會出現什么結果呢?

  舉個最簡單的例子,大家想一下假如為一個32位的變量賦值過程不具備原子性的話,會發生什么后果?

i=9;

 假若一個線程執行到這個語句時,我暫且假設為一個32位的變量賦值包括兩個過程:為低16位賦值,為高16位賦值。

  那么就可能發生一種情況:當將低16位數值寫入之后,突然被中斷,而此時又有一個線程去讀取i的值,那么讀取到的就是錯誤的數據。

 

1.啥是java的原子操作(我的理解跟原子性就是一個意思)

  1. "原子操作(atomic operation)是不需要synchronized",所謂原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行到結束,中間不會有任何 context switch;

  2. java中一般事務管理里面用到原子操作。

    1. 原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分,將整個操作視作一個整體是原子性的核心特征;

    2. 使用原子操作的好處:

      ⑴. 性能角度:它執行多次的所消耗的時間遠遠小於由於線程所掛起到恢復所消耗的時間,因此無鎖的CAS操作在性能上要比同步鎖高很多;

      ⑵. 業務需求:業務本身的需求上,無鎖機制本身就可以滿足我們絕不多數的需求,並且在性能上也可以大大的進行提升。

      例子:我們使用的版本控制工具與之其實非常的相似,如果使用鎖來同步,其實就意味着只能同時一個人對該文件進行修改,此時其他人就無法操作文件,如果生活中真正遇到這樣的情況我們一定會覺得非常不方便,而現實中我們其實並不是這樣,我們大家都可以修改這個文件,只是誰提交的早,那么他就把他的代碼成功提交的版本控制服務器上,其實這一步就對應着一個原子操作,而后操作的人往往卻因為沖突而導致提交失敗,此時他必須重新更新代碼進行再次修改,重新提交。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM