Java CAS操作與Unsafe類(lèi)詳解
計(jì)算機(jī)內(nèi)存模型,synchronized和volatile關(guān)鍵字簡(jiǎn)介
二、兩者對(duì)比sychronized和volatile都解決了內(nèi)存可見(jiàn)性問(wèn)題不同點(diǎn):(1)前者是獨(dú)占鎖,并且存在者上下文切換的開(kāi)銷(xiāo)以及線程重新調(diào)度的開(kāi)銷(xiāo);后者是非阻塞算法,不會(huì)造成上下文切換的開(kāi)銷(xiāo)。(2)前者可以保證操作的原子性,但是后者不能保證操作的原子性。
三、在什么情況下才會(huì)使用volatile 寫(xiě)入變量是不依賴(lài)當(dāng)前值的,如果是依賴(lài)當(dāng)前值的話,由于獲取-計(jì)算-寫(xiě)入,三者不是原子性操作,而volatile是保證原子性操作的。 變量沒(méi)有加鎖的時(shí)候,如果變量加鎖了,是可以保證內(nèi)存的可見(jiàn)性的因此不需要再使用volatile 四、Java中的原子性操作 原子性操作通俗的來(lái)講就是一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗,不存在執(zhí)行部分成功的情況 使用synchronized關(guān)鍵字既可以保證操作的原子性又可以保證內(nèi)存的可見(jiàn)性,volatile只能保證內(nèi)存的可見(jiàn)性,但是不能保證操作的原子性;synchronized固然好,但在高并發(fā)的情況下,由于它是一種獨(dú)占鎖,因此會(huì)引起性能低下的問(wèn)題。 五、Java中的CAS操作 定義:CAS(compare and swap)比較并交換,這是JDK提供的一種非阻塞算法,它通過(guò)硬件保證了比較-更新的原子性問(wèn)題。JDK中的Unsafe類(lèi)提供了一系列的compareAndSwap*方法,下面以compareAndSwapLong為例進(jìn)行講解 boolean compare(Object obj,long offset,long expect,long update) 先分別解釋一下各個(gè)參數(shù),obj是一個(gè)對(duì)象的引用(也就是對(duì)象存儲(chǔ)的地址),offset是相對(duì)于前面地址的偏移量,expect是一個(gè)預(yù)想的值,update代表如果和預(yù)想的值一樣,那么就是使用update這個(gè)值來(lái)代替,并且返回true,否則返回false 這是處理器提供的一種原子性指令 六、ABA問(wèn)題 描述:線程1獲取變量x的值為A,然后嘗試修改為B,但是此時(shí)如果有另一個(gè)線程修改了x的值為B,同時(shí)又修改成了A,那么線程2的這個(gè)A和線程1之前的A就不是同一個(gè)A了 產(chǎn)生原因:環(huán)形依賴(lài),變量的值從A到B,然后又從B到A,這樣只能一個(gè)方向輪轉(zhuǎn),如果是從A到B,然后從B到C就不會(huì)出現(xiàn)這種情況。 解決方式:JDK中的AtomicStampedReferece給每個(gè)變量一個(gè)時(shí)間戳,從而避免了ABA問(wèn)題 七、Unsafe類(lèi)在JDK中的rt.jar包中有許多方法都是native的,這是一種硬件級(jí)別的操作,使用JNI來(lái)調(diào)用C++底層函數(shù)來(lái)操作。
1.long objectFieldOffset(Field field)釋義:獲取某個(gè)對(duì)象的中的某個(gè)域值所在對(duì)象的中的內(nèi)存偏移量
try{ long value = Unsafe.objectFieldOffset(AutomicLong.class.getDeclaredField('value'));}catch(Exception e){ e.printStackTrace();}2.int arrayBaseOffset(Class arrayClass)
釋義:獲取數(shù)組中的第一個(gè)元素地址
3.int arrayIndexOffset(Class arrayClass)釋義:獲取數(shù)組中第一個(gè)元素的字節(jié)大小
4.boolean compareAndSwapLong(Object obj,long offset,long expect,long update)可以見(jiàn)上文
八、源碼:所在包:com.ruigege.OtherFoundationOfConcurrent2
https://github.com/ruigege66/ConcurrentJava
以上就是Java CAS操作與Unsafe類(lèi)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java CAS操作與Unsafe類(lèi)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. XML入門(mén)的常見(jiàn)問(wèn)題(二)2. CSS可以做的幾個(gè)令你嘆為觀止的實(shí)例分享3. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)4. 小技巧處理div內(nèi)容溢出5. 詳解瀏覽器的緩存機(jī)制6. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案7. 概述IE和SQL2k開(kāi)發(fā)一個(gè)XML聊天程序8. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法9. 讀大數(shù)據(jù)量的XML文件的讀取問(wèn)題10. HTML5 Canvas繪制圖形從入門(mén)到精通
