<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

       :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

    在這一部分開(kāi)始討論數(shù)組原子操作和一些其他的原子操作。

    AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API類似,選擇有代表性的AtomicIntegerArray來(lái)描述這些問(wèn)題。

    int get(int i)

    獲取位置 i 的當(dāng)前值。很顯然,由于這個(gè)是數(shù)組操作,就有索引越界的問(wèn)題(IndexOutOfBoundsException異常)。

     

    對(duì)于下面的API起始和AtomicInteger是類似的,這種通過(guò)方法、參數(shù)的名稱就能夠得到函數(shù)意義的寫(xiě)法是非常值得稱贊的。在《重構(gòu):改善既有代碼的設(shè)計(jì)》《代碼整潔之道》中都非常推崇這種做法。


    void set(int i, int newValue)
    void lazySet(int i, int newValue)
    int getAndSet(int i, int newValue)
    boolean compareAndSet(int i, int expect, int update)
    boolean weakCompareAndSet(int i, int expect, int update)
    int getAndIncrement(int i)
    int getAndDecrement(int i)
    int getAndAdd(int i, int delta)
    int incrementAndGet(int i)
    int decrementAndGet(int i)
    int addAndGet(int i, int delta)

     

    整體來(lái)說(shuō),數(shù)組的原子操作在理解上還是相對(duì)比較容易的,這些API就是有多使用才能體會(huì)到它們的好處,而不僅僅是停留在理論階段。

    現(xiàn)在關(guān)注字段的原子更新。

    AtomicIntegerFieldUpdater<T>/AtomicLongFieldUpdater<T>/AtomicReferenceFieldUpdater<T,V>是基于反射的原子更新字段的值。

    相應(yīng)的API也是非常簡(jiǎn)單的,但是也是有一些約束的。

    (1)字段必須是volatile類型的!在后面的章節(jié)中會(huì)詳細(xì)說(shuō)明為什么必須是volatile,volatile到底是個(gè)什么東西。

    (2)字段的描述類型(修飾符public/protected/default/private)是與調(diào)用者與操作對(duì)象字段的關(guān)系一致。也就是說(shuō)調(diào)用者能夠直接操作對(duì)象字段,那么就可以反射進(jìn)行原子操作。但是對(duì)于父類的字段,子類是不能直接操作的,盡管子類可以訪問(wèn)父類的字段。

    (3)只能是實(shí)例變量,不能是類變量,也就是說(shuō)不能加static關(guān)鍵字。

    (4)只能是可修改變量,不能使final變量,因?yàn)閒inal的語(yǔ)義就是不可修改。實(shí)際上final的語(yǔ)義和volatile是有沖突的,這兩個(gè)關(guān)鍵字不能同時(shí)存在。

    (5)對(duì)于AtomicIntegerFieldUpdaterAtomicLongFieldUpdater只能修改int/long類型的字段,不能修改其包裝類型(Integer/Long)。如果要修改包裝類型就需要使用AtomicReferenceFieldUpdater

     

    在下面的例子中描述了操作的方法。

     

    package xylz.study.concurrency.atomic;

    import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

    public class AtomicIntegerFieldUpdaterDemo {

      
    class DemoData{
          
    public volatile int value1 = 1;
          
    volatile int value2 = 2;
          
    protected volatile int value3 = 3;
          
    private volatile int value4 = 4;
       }

        AtomicIntegerFieldUpdater
    <DemoData> getUpdater(String fieldName) {
           
    return AtomicIntegerFieldUpdater.newUpdater(DemoData.class, fieldName);
        }

       
    void doit() {
            DemoData data
    = new DemoData();
            System.out.println(
    "1 ==> "+getUpdater("value1").getAndSet(data, 10));
            System.out.println(
    "3 ==> "+getUpdater("value2").incrementAndGet(data));
            System.out.println(
    "2 ==> "+getUpdater("value3").decrementAndGet(data));
            System.out.println(
    "true ==> "+getUpdater("value4").compareAndSet(data, 4, 5));
        }

       
    public static void main(String[] args) {
            AtomicIntegerFieldUpdaterDemo demo
    = new AtomicIntegerFieldUpdaterDemo();
            demo.doit();
        }

    }
     


    在上面的例子中DemoData的字段value3/value4對(duì)于AtomicIntegerFieldUpdaterDemo類是不可見(jiàn)的,因此通過(guò)反射是不能直接修改其值的。

     

    AtomicMarkableReference類描述的一個(gè)<Object,Boolean>的對(duì),可以原子的修改Object或者Boolean的值,這種數(shù)據(jù)結(jié)構(gòu)在一些緩存或者狀態(tài)描述中比較有用。這種結(jié)構(gòu)在單個(gè)或者同時(shí)修改Object/Boolean的時(shí)候能夠有效的提高吞吐量。

     

    AtomicStampedReference類維護(hù)帶有整數(shù)“標(biāo)志”的對(duì)象引用,可以用原子方式對(duì)其進(jìn)行更新。對(duì)比AtomicMarkableReference類的<Object,Boolean>,AtomicStampedReference維護(hù)的是一種類似<Object,int>的數(shù)據(jù)結(jié)構(gòu),其實(shí)就是對(duì)對(duì)象(引用)的一個(gè)并發(fā)計(jì)數(shù)。但是與AtomicInteger不同的是,此數(shù)據(jù)結(jié)構(gòu)可以攜帶一個(gè)對(duì)象引用(Object),并且能夠?qū)Υ藢?duì)象和計(jì)數(shù)同時(shí)進(jìn)行原子操作。

    在后面的章節(jié)中會(huì)提到“ABA問(wèn)題”,而AtomicMarkableReference/AtomicStampedReference在解決“ABA問(wèn)題”上很有用


    原子操作的使用大概就是這么多,大體來(lái)說(shuō)還算是比較清晰的,在下一個(gè)章節(jié)中,將對(duì)象原子操作進(jìn)行總結(jié),重點(diǎn)介紹下原子操作的原理和設(shè)計(jì)思想。



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-07-02 14:19 imxylz 閱讀(48169) 評(píng)論(6)  編輯  收藏 所屬分類: J2EE

    評(píng)論

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2 2010-07-02 21:33 18傲骨中文
    又是高深學(xué)堂~~~  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2 2010-07-03 10:22 FineReport——報(bào)表技術(shù)領(lǐng)跑者
    很好很強(qiáng)大,哈哈!頂了~  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2[未登錄](méi) 2010-11-23 17:48 Nicholas
    在上面的例子中DemoData的字段value3/value4對(duì)于AtomicIntegerFieldUpdaterDemo類是不可見(jiàn)的,因此通過(guò)反射是不能直接修改其值的。

    老實(shí)說(shuō),這句我實(shí)在沒(méi)有看懂,根據(jù)debug的結(jié)果來(lái)看,data中的value3值確實(shí)最終變?yōu)榱?.  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2 2010-11-23 20:22 xylz
    @Nicholas
    看上面約束2。
    換句話說(shuō)DemoData的value3/value4字段的修飾符protected/private導(dǎo)致這兩個(gè)字段對(duì)于類AtomicIntegerFieldUpdaterDemo 來(lái)說(shuō)是不可見(jiàn)的,因此不能夠通過(guò)AtomicIntegerFieldUpdater來(lái)修改此值。因此運(yùn)行時(shí)下面兩句會(huì)得到一個(gè)非法訪問(wèn)的異常。
    System.out.println("2 ==> "+getUpdater("value3").decrementAndGet(data));
    System.out.println("true ==> "+getUpdater("value4").compareAndSet(data, 4, 5));  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2 2013-06-13 11:38 海藍(lán)
    應(yīng)該是可見(jiàn)的吧@xylz
      回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (3): 原子操作 part 2 2016-03-10 16:30 問(wèn)問(wèn)問(wèn)問(wèn)
    @Nicholas
    @海藍(lán)
    對(duì)啊,默認(rèn)的可以訪問(wèn)到,protected怎么可能訪問(wèn)不到  回復(fù)  更多評(píng)論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看| 男人的天堂亚洲一区二区三区| 四虎影视永久免费观看网址| 亚洲色成人网站WWW永久四虎| 久久天天躁狠狠躁夜夜免费观看| 亚洲国产av一区二区三区丶| 91成人免费在线视频| 2017亚洲男人天堂一| 日韩成人免费视频播放| 国产亚洲男人的天堂在线观看 | 成全在线观看免费观看大全| 国产国拍精品亚洲AV片| 13小箩利洗澡无码视频网站免费| 亚洲国产精品乱码一区二区 | 国产中文字幕在线免费观看| 亚洲免费人成在线视频观看| a在线观看免费视频| 亚洲伊人tv综合网色| 日本XXX黄区免费看| 久久久久久久久无码精品亚洲日韩| 免费一级毛片清高播放| 精品多毛少妇人妻AV免费久久| 亚洲AV无码久久精品成人| 五月婷婷在线免费观看| 亚洲AV香蕉一区区二区三区| 亚洲中文字幕丝袜制服一区| 免费人成在线观看网站品爱网| 天堂亚洲国产中文在线| 国产黄色一级毛片亚洲黄片大全| 日本免费污片中国特一级| 亚洲精品中文字幕无乱码麻豆| 亚洲AV无码一区二三区| 国产精品免费福利久久| 亚洲精品亚洲人成在线| 亚洲日韩精品无码专区网站| 日韩人妻一区二区三区免费| 亚洲欧美精品午睡沙发| 久久久久久久综合日本亚洲| 毛片网站免费在线观看| 中国一级特黄高清免费的大片中国一级黄色片 | 精品久久香蕉国产线看观看亚洲|