Java中原子操作的實現原理

Java中原子操作的實現原理

原子操作就是不可被中斷的一個或一系列操作,看看Java是怎麼實現原子操作的。

CPU實現原子操作

處理器通過對總線加鎖或者緩存行加鎖的方式實現多個處理器之間的原子操作。

通過對總線加鎖實現原子性,現在都是多處理器,對於共享變量的讀寫操作,如果不加限制,可導致數據的不一致,比如處理器把值改成A,另外的處理器又把值改成B,導致不是我們需要的結果。為了解決這個問題,處理器可以使用總線鎖,當一個處理器鎖住總線的時候,其他處理器處於阻塞狀態。這樣能解決問題,但是代價是很大的。通過對緩存行加鎖實現原子性,為了保證原子性,在同一時間,只要保證對於某個內存地址的原子操作即可。緩存一致性機制阻止同時修改由兩個及以上處理器緩存的內存區域數據,當其他處理器回寫已被鎖定的緩存行數據時,會使緩存行無效。

Java的原子操作

Java使用鎖機制和CAS來實現原子操作。

鎖機制實現原子操作,JVM內部實現了很多鎖,比如偏向鎖,輕量級鎖,重量級鎖和互斥鎖。CAS來實現原子操作,實現原理就是通過循環執行CAS操作直到成功為止。Java的併發包中提供了一些Atomic類來支持原子操作。其實CAS操作有些問題,比如ABA問題,循環時間長和共享變了的原子操作。1)ABA問題,可以通過AtomicStampedReference類解決,思路就是加版本號或者時間戳。2)共享變了的原子操作。CAS可以實現一個變量的原子操作,但是不能保證多個共享變量的原子操作。自從Java 1.5起,提供了一個AtomicReference類來實現對象之間的原子性,多個共享變量可以放到一個對象裡面實現原子性。

每天都要進步一點點,哪怕一丁點......