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

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

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

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    為什么ImmutableMap是不可變集合,是線程安全的?
    首先介紹一下基本概念,什么事immutable

    何為Immutable對象?

    簡單地說,如果一個對象實例不能被更改就是一個Immutable的對象,Java SDK提供的大量值對象,比如String等都是Immutable的對象。

    如何使對象Immutable?

    按照Effective Java的說明,需要滿足下面幾條規則:

    • 保證類不能被繼承 - 為了避免其繼承的類進行mutable的操作
    • 移調所有setter/update等修改對象實例的操作
    • 保證所有的field是private和final的

    不可變對象(immutable objects),后面文章我將使用immutable objects來代替不可變對象!

    那么什么是immutable objects?什么又是mutable Objects呢?

    immutable Objects就是那些一旦被創建,它們的狀態就不能被改變的Objects,每次對他們的改變都是產生了新的immutable的對象,而mutable Objects就是那些創建后,狀態可以被改變的Objects.

    舉個例子:String和StringBuilder,String是immutable的,每次對于String對象的修改都將產生一個新的String對象,而原來的對象保持不變,而StringBuilder是mutable,因為每次對于它的對象的修改都作用于該對象本身,并沒有產生新的對象。

    但有的時候String的immutable特性也會引起安全問題,這就是密碼應該存放在字符數組中而不是String中的原因!

    immutable objects 比傳統的mutable對象在多線程應用中更具有優勢,它不僅能夠保證對象的狀態不被改變,而且還可以不使用鎖機制就能被其他線程共享。

    實際上JDK本身就自帶了一些immutable類,比如String,Integer以及其他包裝類。為什么說String是immutable的呢?比如:java.lang.String 的trim,uppercase,substring等方法,它們返回的都是新的String對象,而并不是直接修改原來的對象。

    如何在Java中寫出Immutable的類?

    要寫出這樣的類,需要遵循以下幾個原則:

    1)immutable對象的狀態在創建之后就不能發生改變,任何對它的改變都應該產生一個新的對象。

    2)Immutable類的所有的屬性都應該是final的。

    3)對象必須被正確的創建,比如:對象引用在對象創建過程中不能泄露(leak)。

    4)對象應該是final的,以此來限制子類繼承父類,以避免子類改變了父類的immutable特性。

    5)如果類中包含mutable類對象,那么返回給客戶端的時候,返回該對象的一個拷貝,而不是該對象本身(該條可以歸為第一條中的一個特例)

    當然不完全遵守上面的原則也能夠創建immutable的類,比如String的hashcode就不是final的,但它能保證每次調用它的值都是一致的,無論你多少次計算這個值,它都是一致的,因為這些值的是通過計算final的屬性得來的!


    有時候你要實現的immutable類中可能包含mutable的類,比如java.util.Date,盡管你將其設置成了final的,但是它的值還是可以被修改的,為了避免這個問題,我們建議返回給用戶該對象的一個拷貝,這也是Java的最佳實踐之一。
    使用Immutable類的好處:
    1)Immutable對象是線程安全的,可以不用被synchronize就在并發環境中共享

    2)Immutable對象簡化了程序開發,因為它無需使用額外的鎖機制就可以在線程間共享

    3)Immutable對象提高了程序的性能,因為它減少了synchroinzed的使用

    4)Immutable對象是可以被重復使用的,你可以將它們緩存起來重復使用,就像字符串字面量和整型數字一樣。你可以使用靜態工廠方法來提供類似于valueOf()這樣的方法,它可以從緩存中返回一個已經存在的Immutable對象,而不是重新創建一個。

    immutable也有一個缺點就是會制造大量垃圾,由于他們不能被重用而且對于它們的使用就是”用“然后”扔“,字符串就是一個典型的例子,它會創造很多的垃圾,給垃圾收集帶來很大的麻煩。當然這只是個極端的例子,合理的使用immutable對象會創造很大的價值。



    Guava提供的ImmutableMap是一個支持多線程環境下面的安全的Map,同時效率也是很高的Key-Value集合,為什么他就是安全的呢。
        先看下面例子:
            ImmutableMap.Builder<String, Object> request = ImmutableMap.builder();
            request.put("one","1");
            request.put("two","2");
            request.put("three","3");
            Map<String, Object> map = request.build();
            
            讓我們首先從Builder<T,T>入手進行分析

     public static class Builder<K, V> {
        TerminalEntry<K, V>[] entries;
        int size;


     public ImmutableMap<K, V> build() {
          switch (size) {
            case 0:
              return of();
            case 1:
              return of(entries[0].getKey(), entries[0].getValue());
            default:
              return new RegularImmutableMap<K, V>(size, entries);
          }
        }

    }

    上面的
     ImmutableMap.Builder<String, Object> request = ImmutableMap.builder();
    這個實例創建的時候,只是創建了一個空的對象。
    那么實際效用的是build()
      @SuppressWarnings("unchecked")
        Builder(int initialCapacity) {
          this.entries = new TerminalEntry[initialCapacity];
          this.size = 0;
        }


























             


    posted on 2015-01-08 19:47 abin 閱讀(5100) 評論(0)  編輯  收藏 所屬分類: guava

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 美女黄频视频大全免费的| 亚洲欧美成aⅴ人在线观看| 国产精品永久免费| 最新亚洲成av人免费看| 国产乱妇高清无乱码免费| 夜夜春亚洲嫩草影院| 国产午夜不卡AV免费| 亚洲国产精品lv| 中文字幕免费在线看线人 | 亚洲人成77777在线播放网站| yellow免费网站| 亚洲精品白浆高清久久久久久| 国产线视频精品免费观看视频| 亚洲国产精品无码专区在线观看| 性xxxxx大片免费视频| 亚洲福利秒拍一区二区| 妞干网免费视频观看| 色视频在线观看免费| 国产亚洲福利精品一区| 久久精品免费电影| 日韩亚洲国产高清免费视频| 在线播放免费播放av片| 一道本在线免费视频| 亚洲精品无码久久久影院相关影片 | 亚洲免费闲人蜜桃| 日本亚洲色大成网站www久久| 国产精品色午夜免费视频| 欧洲亚洲综合一区二区三区| 国产亚洲色婷婷久久99精品91| 免费精品一区二区三区第35| 亚洲国产精品久久久久秋霞影院| 色婷婷7777免费视频在线观看| 国产精品亚洲色婷婷99久久精品| 国产啪亚洲国产精品无码| 久久精品一本到99热免费| 亚洲熟妇少妇任你躁在线观看| 免费一级特黄特色大片在线 | 亚洲天堂免费在线| 亚洲a∨国产av综合av下载| 国产亚洲AV手机在线观看| 日韩免费一区二区三区在线播放|