這篇文章主要介紹Java并發編程之CAS的案例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在Java并發編程的世界里,synchronized 和 Lock 是控制多線程并發環境下對共享資源同步訪問的兩大手段。其中 Lock 是 JDK 層面的鎖機制,是輕量級鎖,底層使用大量的自旋+CAS操作實現的。
那什么是CAS呢?CAS,compare and swap,即比較并交換,什么是比較并交換呢?在Lock鎖的理念中,采用的是一種樂觀鎖的形式,即多線程去修改共享資源時,不是在修改之前就加鎖,而是樂觀的認為沒有別的線程和自己爭鎖,就是通過CAS的理念去保障共享資源的安全性的。CAS的基本思想是,拿變量的原值和內存中的值進行比較,如果相同,則原值沒有被修改過,那么就將原值修改為新值,這兩步是原子的,能夠保證同一時間只有一個線程修改成功。這就是CAS的理念。
Java中要想使用CAS原子的修改某值,怎么做呢?幸運的是Java提供了這樣的API,就是在sun.misc.Unsafe.java類中。Unsafe,中文名不安全的,也被稱為魔術類,魔法類。
Unsafe類介紹
Unsafe類使Java擁有了像C語言的指針一樣操作內存空間的能力,一旦能夠直接操作內存,這也就意味著
(1)不受JVM管理,意思就是使用Unsafe操作內存無法被JVM GC,需要我們手動GC,稍有不慎就會出現內存泄漏。
(2)Unsafe的不少方法中必須提供原始地址(內存地址)和被替換對象的地址,并且偏移量要自己計算(其提供的有計算偏移量的方法),所以一旦出現問題就是JVM崩潰級別的異常,會導致整個JVM實例崩潰,表現為應用程序直接crash掉。
(3)直接操作內存,所以速度更快,在高并發的條件之下能夠很好地提高效率。
因此,從上面三個角度來看,雖然在一定程度上提升了效率但是也帶來了指針的不安全性。這也是它被取名為Unsafe的原因吧。
下面我們深入到源碼中看看,提供了什么方法直接操作內存。
打開Unsafe這個類,我們會發現里面有大量的被native關鍵字修飾的方法,這意味著這些方法是C語言提供的實現,底層調的是C語言的庫函數,我們無法直接看到他的源碼實現,需要去從OpenJDK去看了。另外還有一些基于native方法封裝的其他方法,整個Unsafe中的方法大致可以歸結為以下幾類:
(1)初始化操作
(2)操作對象屬性
(3)操作數組元素
(4)線程掛起和恢復
(5)CAS機制
CAS的使用
如果你學過java并發編程的話,稍微閱讀過JUC并發包里面的源碼的話,對這個Unsafe類一定不陌生,因為整個java并發包底層實現的核心就是靠它。JUC并發包中主要使用它提供的CAS(compare and swap,比較并交換)操作,原子的修改鎖的狀態和一些隊列元素。
沒看過JUC源碼的讀者也不用擔心,今天我們就是簡單介紹Unsafe類中的CAS操作,那么我們接下來就會通過一個簡單的例子來看看Unsafe的CAS是怎么使用的。
首先,使用這個類我們第一個要做的事情就是拿到這個類的實例,下面我們自定義了一個Util類用來獲取Unsafe的實例
import sun.misc.Unsafe; import java.lang.reflect.Field; public class UnsafeUtil { public static Unsafe reflectGetUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); return (Unsafe) field.get(null); } catch (Exception e) { e.printStackTrace(); } return null; } }
本文題目:Java并發編程之CAS的案例分析-創新互聯
本文網址:http://vcdvsql.cn/article40/pjoeo.html
成都網站建設公司_創新互聯,為您提供微信小程序、企業網站制作、定制網站、網頁設計公司、服務器托管、虛擬主機
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯