91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java怎么實現一個CAS和Unsafe類

發布時間:2021-03-01 17:06:32 來源:億速云 閱讀:171 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關使用Java怎么實現一個CAS和Unsafe類,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

兩者對比

sychronized和volatile都解決了內存可見性問題
不同點:
(1)前者是獨占鎖,并且存在者上下文切換的開銷以及線程重新調度的開銷;后者是非阻塞算法,不會造成上下文切換的開銷。
(2)前者可以保證操作的原子性,但是后者不能保證操作的原子性。

在什么情況下才會使用volatile

  • 寫入變量是不依賴當前值的,如果是依賴當前值的話,由于獲取-計算-寫入,三者不是原子性操作,而volatile是保證原子性操作的。

  • 變量沒有加鎖的時候,如果變量加鎖了,是可以保證內存的可見性的因此不需要再使用volatile

Java中的原子性操作

  • 原子性操作通俗的來講就是一組操作,要么都執行成功,要么都執行失敗,不存在執行部分成功的情況

  • 使用synchronized關鍵字既可以保證操作的原子性又可以保證內存的可見性,volatile只能保證內存的可見性,但是不能保證操作的原子性;synchronized固然好,但在高并發的情況下,由于它是一種獨占鎖,因此會引起性能低下的問題。

Java中的CAS操作

  • 定義:CAS(compare and swap)比較并交換,這是JDK提供的一種非阻塞算法,它通過硬件保證了比較-更新的原子性問題。JDK中的Unsafe類提供了一系列的compareAndSwap*方法,下面以compareAndSwapLong為例進行講解

  • boolean compare(Object obj,long offset,long expect,long update)

  • 先分別解釋一下各個參數,obj是一個對象的引用(也就是對象存儲的地址),offset是相對于前面地址的偏移量,expect是一個預想的值,update代表如果和預想的值一樣,那么就是使用update這個值來代替,并且返回true,否則返回false

  • 這是處理器提供的一種原子性指令

ABA問題

  • 描述:線程1獲取變量x的值為A,然后嘗試修改為B,但是此時如果有另一個線程修改了x的值為B,同時又修改成了A,那么線程2的這個A和線程1之前的A就不是同一個A了

  • 產生原因:環形依賴,變量的值從A到B,然后又從B到A,這樣只能一個方向輪轉,如果是從A到B,然后從B到C就不會出現這種情況。

  • 解決方式:JDK中的AtomicStampedReferece給每個變量一個時間戳,從而避免了ABA問題

Unsafe類

在JDK中的rt.jar包中有許多方法都是native的,這是一種硬件級別的操作,使用JNI來調用C++底層函數來操作。

1.long objectFieldOffset(Field field)

釋義:獲取某個對象的中的某個域值所在對象的中的內存偏移量

try{
 long value = Unsafe.objectFieldOffset(AutomicLong.class.getDeclaredField("value"));
}catch(Exception e){
 e.printStackTrace();
}

2.int arrayBaseOffset(Class arrayClass)

釋義:獲取數組中的第一個元素地址

3.int arrayIndexOffset(Class arrayClass)

釋義:獲取數組中第一個元素的字節大小

4.boolean compareAndSwapLong(Object obj,long offset,long expect,long update)

以上就是使用Java怎么實現一個CAS和Unsafe類,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台江县| 永嘉县| 宾阳县| 建宁县| 屏边| 秦皇岛市| 罗平县| 夏邑县| 红原县| 库尔勒市| 宁晋县| 太谷县| 怀柔区| 五家渠市| 老河口市| 建瓯市| 岢岚县| 彭州市| 阳谷县| 吉林省| 宜州市| 保康县| 探索| 开化县| 孟村| 思南县| 通州市| 会宁县| 上虞市| 盐源县| 噶尔县| 灵武市| 巴楚县| 康马县| 喀喇| 西宁市| 西安市| 永平县| 德惠市| 晋中市| 五大连池市|