AtomicIntegerFieldUpdater類的實現(xiàn)

介紹:

這個類是基于反射的一個工具類,用于對一個類的 volatile int 的值進行一個原子修改闪幽。

詳解:

其實這個類的實現(xiàn)和其他的Atomic類的實現(xiàn)差不多,都是一個cas 的原理,只不過在這基礎上用了反射來控制對象的字段。

這個類通過一個抽象類蒋譬,內(nèi)部有個實現(xiàn)類,通過

  @CallerSensitive
    public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,
                                                              String fieldName) {
        return new AtomicIntegerFieldUpdaterImpl<U>
            (tclass, fieldName, Reflection.getCallerClass());
    }

來構造實現(xiàn)類愉适,而實現(xiàn)類也不復雜羡铲,主要做了一些鑒權的工作


  AtomicIntegerFieldUpdaterImpl(final Class<T> tclass,
                                      final String fieldName,
                                      final Class<?> caller) {
            final Field field;
            final int modifiers;
            try {
                //將這個方法作標示為特權方法
                field = AccessController.doPrivileged(
                    new PrivilegedExceptionAction<Field>() {
                        public Field run() throws NoSuchFieldException {
                            return tclass.getDeclaredField(fieldName);
                        }
                    });
                //獲取修飾符
                modifiers = field.getModifiers();
                //判斷調(diào)用類對對象類在 modifiers修飾符下有權限調(diào)用
                sun.reflect.misc.ReflectUtil.ensureMemberAccess(
                    caller, tclass, null, modifiers);
                ClassLoader cl = tclass.getClassLoader();
                ClassLoader ccl = caller.getClassLoader();
                if ((ccl != null) && (ccl != cl) &&
                    ((cl == null) || !isAncestor(cl, ccl))) {
                   //如果調(diào)用方不是被調(diào)用方的祖先的話,檢查包訪問權限
                  sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
                }
            } catch (PrivilegedActionException pae) {
                throw new RuntimeException(pae.getException());
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }

            Class<?> fieldt = field.getType();
            //判斷是否是int
            if (fieldt != int.class)
                throw new IllegalArgumentException("Must be integer type");
           //判斷是否為volatile
            if (!Modifier.isVolatile(modifiers))
                throw new IllegalArgumentException("Must be volatile type");
            //這步是為了之后的權限校驗儡毕,如果不為null 之后調(diào)用會校驗包權限
            this.cclass = (Modifier.isProtected(modifiers) &&
                           caller != tclass) ? caller : null;
            this.tclass = tclass;
          //獲取偏移量
            offset = unsafe.objectFieldOffset(field);
        }

其他的部分實現(xiàn)和普通的Atomic類差不多,看這個把java權限部分知識補了一下扑媚。

參考資料 :

https://www.ibm.com/developerworks/cn/java/j-lo-rtsecurity/index.html
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰湾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疆股,更是在濱河造成了極大的恐慌费坊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旬痹,死亡現(xiàn)場離奇詭異附井,居然都是意外死亡,警方通過查閱死者的電腦和手機两残,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門永毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人人弓,你說我怎么就攤上這事沼死。” “怎么了崔赌?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵意蛀,是天一觀的道長。 經(jīng)常有香客問我健芭,道長县钥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任慈迈,我火速辦了婚禮若贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己兜看,他們只是感情好锥咸,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著细移,像睡著了一般搏予。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弧轧,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天雪侥,我揣著相機與錄音,去河邊找鬼精绎。 笑死速缨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的代乃。 我是一名探鬼主播旬牲,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搁吓!你這毒婦竟也來了原茅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤堕仔,失蹤者是張志新(化名)和其女友劉穎擂橘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩骨,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡通贞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恼五。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌罩。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唤冈,靈堂內(nèi)的尸體忽然破棺而出峡迷,到底是詐尸還是另有隱情,我是刑警寧澤你虹,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布绘搞,位于F島的核電站,受9級特大地震影響傅物,放射性物質(zhì)發(fā)生泄漏夯辖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一董饰、第九天 我趴在偏房一處隱蔽的房頂上張望蒿褂。 院中可真熱鬧圆米,春花似錦、人聲如沸啄栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昙楚。三九已至近速,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堪旧,已是汗流浹背削葱。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淳梦,地道東北人析砸。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像爆袍,于是被迫代替她去往敵國和親首繁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容