Compare and Swap:CAS操作需要輸入兩個(gè)數(shù)值,一個(gè)舊值(期望操作? 前的值),一個(gè)新值,在操作期間先比較舊值有沒(méi)有發(fā)生變化,如果沒(méi)有發(fā)生變化才交換成新值,發(fā)生了變化則不交換。
Q:處理器如何實(shí)現(xiàn)原子操作?
1.使用總線鎖保證原子性
2.使用緩存鎖保證原子性
Java如何實(shí)現(xiàn)原子操作:
(1)使用循環(huán)CAS實(shí)現(xiàn)原子操作
JVM中的CAS操作正是利用了處理器提供的CMPXCHG指令實(shí)現(xiàn)的,自旋的CAS實(shí)現(xiàn)的基本思路就是循環(huán)進(jìn)行CAS操作直到成功為止。
3.使用鎖機(jī)制實(shí)現(xiàn)原子操作
鎖機(jī)制保證了只有獲得鎖的線程才能夠操作鎖定的內(nèi)存區(qū)域。JVM內(nèi)部實(shí)現(xiàn)了很多鎖機(jī)制,有偏向鎖,輕量級(jí)鎖和互斥鎖有意思的是除了偏向鎖,JVM實(shí)現(xiàn)鎖的方式都用了循環(huán)CAS,即當(dāng)一個(gè)線程向進(jìn)入同步塊的時(shí)候使用CAS的方式來(lái)獲取鎖,當(dāng)它退出同步塊的是很好使用循環(huán)CAS釋放鎖。