這篇文章主要介紹Java并發(fā)編程之CAS的案例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
為婺城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及婺城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站制作、婺城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!在Java并發(fā)編程的世界里,synchronized 和 Lock 是控制多線程并發(fā)環(huán)境下對(duì)共享資源同步訪問的兩大手段。其中 Lock 是 JDK 層面的鎖機(jī)制,是輕量級(jí)鎖,底層使用大量的自旋+CAS操作實(shí)現(xiàn)的。
那什么是CAS呢?CAS,compare and swap,即比較并交換,什么是比較并交換呢?在Lock鎖的理念中,采用的是一種樂觀鎖的形式,即多線程去修改共享資源時(shí),不是在修改之前就加鎖,而是樂觀的認(rèn)為沒有別的線程和自己爭(zhēng)鎖,就是通過CAS的理念去保障共享資源的安全性的。CAS的基本思想是,拿變量的原值和內(nèi)存中的值進(jìn)行比較,如果相同,則原值沒有被修改過,那么就將原值修改為新值,這兩步是原子的,能夠保證同一時(shí)間只有一個(gè)線程修改成功。這就是CAS的理念。
Java中要想使用CAS原子的修改某值,怎么做呢?幸運(yùn)的是Java提供了這樣的API,就是在sun.misc.Unsafe.java類中。Unsafe,中文名不安全的,也被稱為魔術(shù)類,魔法類。
Unsafe類介紹
Unsafe類使Java擁有了像C語(yǔ)言的指針一樣操作內(nèi)存空間的能力,一旦能夠直接操作內(nèi)存,這也就意味著
(1)不受JVM管理,意思就是使用Unsafe操作內(nèi)存無法被JVM GC,需要我們手動(dòng)GC,稍有不慎就會(huì)出現(xiàn)內(nèi)存泄漏。
(2)Unsafe的不少方法中必須提供原始地址(內(nèi)存地址)和被替換對(duì)象的地址,并且偏移量要自己計(jì)算(其提供的有計(jì)算偏移量的方法),所以一旦出現(xiàn)問題就是JVM崩潰級(jí)別的異常,會(huì)導(dǎo)致整個(gè)JVM實(shí)例崩潰,表現(xiàn)為應(yīng)用程序直接crash掉。
(3)直接操作內(nèi)存,所以速度更快,在高并發(fā)的條件之下能夠很好地提高效率。
因此,從上面三個(gè)角度來看,雖然在一定程度上提升了效率但是也帶來了指針的不安全性。這也是它被取名為Unsafe的原因吧。
下面我們深入到源碼中看看,提供了什么方法直接操作內(nèi)存。
打開Unsafe這個(gè)類,我們會(huì)發(fā)現(xiàn)里面有大量的被native關(guān)鍵字修飾的方法,這意味著這些方法是C語(yǔ)言提供的實(shí)現(xiàn),底層調(diào)的是C語(yǔ)言的庫(kù)函數(shù),我們無法直接看到他的源碼實(shí)現(xiàn),需要去從OpenJDK去看了。另外還有一些基于native方法封裝的其他方法,整個(gè)Unsafe中的方法大致可以歸結(jié)為以下幾類:
(1)初始化操作
(2)操作對(duì)象屬性
(3)操作數(shù)組元素
(4)線程掛起和恢復(fù)
(5)CAS機(jī)制
CAS的使用
如果你學(xué)過java并發(fā)編程的話,稍微閱讀過JUC并發(fā)包里面的源碼的話,對(duì)這個(gè)Unsafe類一定不陌生,因?yàn)檎麄€(gè)java并發(fā)包底層實(shí)現(xiàn)的核心就是靠它。JUC并發(fā)包中主要使用它提供的CAS(compare and swap,比較并交換)操作,原子的修改鎖的狀態(tài)和一些隊(duì)列元素。
沒看過JUC源碼的讀者也不用擔(dān)心,今天我們就是簡(jiǎn)單介紹Unsafe類中的CAS操作,那么我們接下來就會(huì)通過一個(gè)簡(jiǎn)單的例子來看看Unsafe的CAS是怎么使用的。
首先,使用這個(gè)類我們第一個(gè)要做的事情就是拿到這個(gè)類的實(shí)例,下面我們自定義了一個(gè)Util類用來獲取Unsafe的實(shí)例
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并發(fā)編程之CAS的案例分析-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://aaarwkj.com/article40/pjoeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、企業(yè)網(wǎng)站制作、定制網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、服務(wù)器托管、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容