成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【實戰(zhàn)Java高并發(fā)程序設(shè)計】連載1–Java中的指針:Unsafe類

EasonTyler / 2283人閱讀

摘要:不難看出,方法的內(nèi)部,必然是使用原子指令來完成的。它是一個內(nèi)部使用的專屬類。注意根據(jù)類加載器的工作原理,應(yīng)用程序的類由加載。加載器沒有對象的對象,因此試圖獲得這個類加載器會返回。

如果你對技術(shù)有著不折不撓的追求,應(yīng)該還會特別在意incrementAndGet() 方法中compareAndSet()的實現(xiàn)?,F(xiàn)在,就讓我們更進(jìn)一步看一下它把!
public final boolean compareAndSet(int expect, int update) {

return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

}
在這里,我們看到一個特殊的變量unsafe。它是sun.misc.Unsafe類型。從名字看,這個類應(yīng)該是封裝了一些不安全的操作。那什么操作是不安全的呢?學(xué)習(xí)過C或者C++的話,大家應(yīng)該知道,指針是不安全的。這也是在Java中把指針去除的重要原因。如果指針指錯了位置,或者計算指針偏移量時出錯,結(jié)果可能是災(zāi)難性的,你很有可能會覆蓋別人的內(nèi)存,導(dǎo)致系統(tǒng)奔潰。
而這里的Unsafe就是封裝了一些類似指針的操作。compareAndSwapInt()方法是一個navtive方法。它的幾個參數(shù)含義如下:
public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);
第一個參數(shù)o為給定的對象,offset為對象內(nèi)的偏移量(其實就是一個字段到對象頭部的偏移量,通過這個偏移量可以快速定位字段),expected表示期望值,x表示要設(shè)置的值。如果指定的字段的值等于expected,那么就會把它設(shè)置為x。
不難看出,compareAndSwapInt()方法的內(nèi)部,必然是使用CAS原子指令來完成的。此外,Unsafe類還提供了一些方法,主要有以下幾個(以Int操作為例,其他數(shù)據(jù)類型是類似的):

//獲得給定對象偏移量上的int值
public native int getInt(Object o, long offset);
//設(shè)置給定對象偏移量上的int值
public native void putInt(Object o, long offset, int x);
//獲得字段在對象中的偏移量
public native long objectFieldOffset(Field f);
//設(shè)置給定對象的int值,使用volatile語義
public native void putIntVolatile(Object o, long offset, int x);
//獲得給定對象對象的int值,使用volatile語義
public native int     getIntVolatile(Object o, long offset);
//和putIntVolatile()一樣,但是它要求被操作字段就是volatile類型的
public native void putOrderedInt(Object o, long offset, int x);
如果大家還記得“3.3.4 深度剖析ConcurrentLinkedQueue”一節(jié)中的描述的ConcurrentLinkedQueue實現(xiàn),應(yīng)該對ConcurrentLinkedQueue中的Node還有些印象。Node一些CAS操作也都是使用Unsafe類來實現(xiàn)的。大家可以回顧一下,以加深對Unsafe類的印象。
這里就可以看到,雖然Java拋棄了指針。但是在關(guān)鍵時刻,類似指針的技術(shù)還是必不可少的。這里底層的Unsafe實現(xiàn)就是最好的例子。但是很不幸,JDK的開發(fā)人員并不希望大家使用這個類。獲得Unsafe實例的方法是調(diào)動其工廠方法getUnsafe()。但是,它的實現(xiàn)卻是這樣:
public static Unsafe getUnsafe() {
Class cc = Reflection.getCallerClass();
if (cc.getClassLoader() != null)
throw new SecurityException(“Unsafe”);
return theUnsafe;
}

注意加粗部分的代碼,它會檢查調(diào)用getUnsafe()函數(shù)的類,如果這個類的ClassLoader不為null,就直接拋出異常,拒絕工作。因此,這也使得我們自己的應(yīng)用程序無法直接使用Unsafe類。它是一個JDK內(nèi)部使用的專屬類。
注意:根據(jù)Java 類加載器的工作原理,應(yīng)用程序的類由App Loader加載。而系統(tǒng)核心類,如rt.jar中的類由Bootstrap類加載器加載。Bootstrap加載器沒有Java對象的對象,因此試圖獲得這個類加載器會返回null。所以,當(dāng)一個類的類加載器為null時,說明它是由Bootstrap加載的,而這個類也極有可能是rt.jar中的類。
本書現(xiàn)已上市,QQ群交流:397196583
購買地址:http://item.jd.com/11800589.html

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65454.html

相關(guān)文章

  • 實戰(zhàn)Java并發(fā)程序設(shè)計2】無鎖的對象引用:AtomicReference

    摘要:實戰(zhàn)高并發(fā)程序設(shè)計連載中的指針類和非常類似,不同之處就在于是對整數(shù)的封裝,而則對應(yīng)普通的對象引用。這樣,當(dāng)前線程就無法正確判斷這個對象究竟是否被修改過。摘自實戰(zhàn)高并發(fā)程序設(shè)計一書 【實戰(zhàn)Java高并發(fā)程序設(shè)計】連載1–Java中的指針:Unsafe類 AtomicReference和AtomicInteger非常類似,不同之處就在于AtomicInteger是對整數(shù)的封裝,而Atomi...

    lucas 評論0 收藏0
  • 實戰(zhàn)Java并發(fā)程序設(shè)計5】讓普通變量也享受原子操作

    摘要:有時候,由于初期考慮不周,或者后期的需求變化,一些普通變量可能也會有線程安全的需求。它可以讓你在不改動或者極少改動原有代碼的基礎(chǔ)上,讓普通的變量也享受操作帶來的線程安全性,這樣你可以修改極少的代碼,來獲得線程安全的保證。 有時候,由于初期考慮不周,或者后期的需求變化,一些普通變量可能也會有線程安全的需求。如果改動不大,我們可以簡單地修改程序中每一個使用或者讀取這個變量的地方。但顯然,這...

    appetizerio 評論0 收藏0
  • 實戰(zhàn)Java并發(fā)程序設(shè)計6】挑戰(zhàn)無鎖算法

    摘要:在本例中,講述的無鎖來自于并發(fā)包我們將這個無鎖的稱為。在這里,我們使用二維數(shù)組來表示的內(nèi)部存儲,如下變量存放所有的內(nèi)部元素。為什么使用二維數(shù)組去實現(xiàn)一個一維的呢這是為了將來進(jìn)行動態(tài)擴(kuò)展時可以更加方便。 我們已經(jīng)比較完整得介紹了有關(guān)無鎖的概念和使用方法。相對于有鎖的方法,使用無鎖的方式編程更加考驗一個程序員的耐心和智力。但是,無鎖帶來的好處也是顯而易見的,第一,在高并發(fā)的情況下,它比有鎖...

    zengdongbao 評論0 收藏0
  • Java多線程進(jìn)階(二五)—— J.U.C之collections框架:ConcurrentSkip

    摘要:同時,也提供了一個基于的實現(xiàn)類,底層基于紅黑樹設(shè)計,是一種有序的??梢钥闯墒遣l(fā)版本的,但是和不同是,并不是基于紅黑樹實現(xiàn)的,其底層是一種類似跳表的結(jié)構(gòu)。上述所有構(gòu)造器都調(diào)用了方法方法將一些字段置初始化,然后將指針指向新創(chuàng)建的結(jié)點。 showImg(https://segmentfault.com/img/remote/1460000016201159); 本文首發(fā)于一世流云專欄:ht...

    huashiou 評論0 收藏0
  • Java面試 32個核心必考點完全解析

    摘要:如問到是否使用某框架,實際是是問該框架的使用場景,有什么特點,和同類可框架對比一系列的問題。這兩個方向的區(qū)分點在于工作方向的側(cè)重點不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個核心必考點完全解析(完) 課程預(yù)習(xí) 1.1 課程內(nèi)容分為三個模塊 基礎(chǔ)模塊: 技術(shù)崗位與面試 計算機(jī)基礎(chǔ) JVM原理 多線程 設(shè)計模式 數(shù)據(jù)結(jié)構(gòu)與算法 應(yīng)用模塊: 常用工具集 ...

    JiaXinYi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<