Google Collections(Guava)中強(qiáng)大的Concurrent MapMaker

仔細(xì)研究了剛發(fā)布1.0版本的Google Collections用押,被其中的MapMaker震驚流强,這不就是我夢(mèng)寐以求的Concurrent Map神器嗎?如果Google Collection在5年前就發(fā)布該有多好屎勘?合搅!廢話少講贬媒,邀請(qǐng)大家一起來觀賞一下什么是MapMaker粉私。 *Hashtable太老土啦,線程安全我都用ConcurrentHashMap壁顶。什么珠洗?現(xiàn)在流行MapMaker? *

JDK 1.5引入的ConcurrentHashMap由于其精巧的設(shè)計(jì),更高的并發(fā)性能博助,捕獲了大家的心险污,在并發(fā)場(chǎng)景中出場(chǎng)率極高,但隨著深入的使用富岳,很快的就發(fā)現(xiàn)了其中的不足蛔糯。例如在以Map作為Cache的典型場(chǎng)景中,我們都需要有元素過期的處理窖式,WeakHashMap是這方面的高手蚁飒,但其在并發(fā)方面有點(diǎn)菜(非線程安全),當(dāng)我們想讓這兩位大將同時(shí)上場(chǎng)的時(shí)候萝喘,就只能抓耳搔腮了淮逻。 Google Collections中的MapMaker融合了Weak Reference,線程安全阁簸,高并發(fā)性能爬早,異步超時(shí)清理,自定義構(gòu)建元素等強(qiáng)大功能于一身启妹。(注) 常閱讀優(yōu)秀源代碼的童鞋都知道筛严,一般叫Maker的對(duì)象都是Builder模式,而這個(gè)MapMaker就是來"Build"Map的饶米,下面的代碼展示了如何構(gòu)建一個(gè)高并發(fā)性能桨啃,線程安全的WeakHashMap. Java代碼
收藏代碼

public void testWeakKeys() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakKeys() // 指定Map保存的Key為WeakReference機(jī)制
.makeMap();

Key key = new Key();  
map.put(key, new Value()); // 加入元素  
key = null; // key變成了WeakReference  

System.gc();// 觸發(fā)垃圾回收  
TimeUnit.SECONDS.sleep(1L);  

assertTrue(map.isEmpty()); // map空了车胡,因?yàn)閃eakReference被回收  

}

是不是夠簡(jiǎn)單?他不僅支持WeakKeys照瘾,還支持WeakValues匈棘。 Java代碼
收藏代碼

public void testWeakValues() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakValues() // 指定Map保存的Value為WeakReference機(jī)制
.makeMap();

Key key = new Key();  
Value value = new Value();  
map.put(key, value); // 加入元素  
key = null; // Key成了WeakReference  
  
System.gc();// 觸發(fā)垃圾回收  
TimeUnit.SECONDS.sleep(1L);  
  
assertFalse(map.isEmpty()); // map里的東西還在,因?yàn)閂alue還是StrongReference  
  
value = null; // 這次value也變成了WeakReference  

System.gc(); // 觸發(fā)垃圾回收  
TimeUnit.SECONDS.sleep(1L);  

assertTrue(map.isEmpty()); // map真空了析命,因?yàn)閂alue是WeakReference被回收  

}

還可以選用SoftKeys主卫,和SoftValues,隨意組合碳却,比只能WeakKey的WeakHashMap擴(kuò)展性強(qiáng)太多了队秩。 再來看看On-demand value computation笑旺,自定義構(gòu)建元素昼浦。想象下面的場(chǎng)景,你要為一個(gè)查詢學(xué)生信息的DAO增加結(jié)果緩存筒主,并且結(jié)果超過60秒過期关噪,我們可以用裝飾模式結(jié)合MapMaker簡(jiǎn)單的實(shí)現(xiàn)。 Java代碼
收藏代碼

interface StudentDao {
Information query(String name);
}

class StudentDaoImpl implements StudentDao {
// 真正去查數(shù)據(jù)庫的實(shí)現(xiàn)類 代碼省略
}
// 裝飾器
class CachedStudentDao implements StudentDao {
private final StudentDao studentDao;
private final ConcurrentMap<String, Information> cache;

public CachedStudentDao(final StudentDao studentDao) {  
    Preconditions.checkNotNull(studentDao, "studentDao");  
    this.studentDao = studentDao;  
      
    this.cache = new MapMaker() // 構(gòu)建一個(gè) computingMap  
        .expiration(60, TimeUnit.SECONDS) // 元素60秒過期  
        .makeComputingMap(new Function<String, Information>(){  
            @Override  
            public Information apply(String name) {  
                return studentDao.query(name);  
            }  
        });  
        // 傳入匿名Function自定義緩存的初始化乌妙。如果緩存中沒有name對(duì)應(yīng)的數(shù)據(jù)使兔,則調(diào)用真正的dao去數(shù)據(jù)庫查找數(shù)據(jù),同時(shí)緩存結(jié)果藤韵。  
}  

@Override  
public Information query(String name) {  
    return cache.get(name); // 從computing cache中取結(jié)果  
}  

}

public void test() {
StudentDao cachedStudentDao = new CachedStudentDao(studentDaoImpl);
// 裝飾了studenDaoImpl的cachedStudentDao具備了緩存結(jié)果的能力虐沥。
}

線程安全,高并發(fā)性能泽艘,元素過期都實(shí)現(xiàn)了欲险,并且代碼很簡(jiǎn)潔。多虧了MapMaker匹涮,臟活天试、累活,就交給它啦然低。不過要注意的是喜每,要遵循ConcurrentHashMap的規(guī)范,其不允許有Null的Key和Value雳攘。如果查詢出來的結(jié)果可能為Null的带兜,可用簡(jiǎn)單的包裝類包裝一下,這里不給出代碼了吨灭。 怎么樣刚照?你是不是心動(dòng)了呢?快下載來看看吧沃于。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涩咖,一起剝皮案震驚了整個(gè)濱河市海诲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檩互,老刑警劉巖特幔,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闸昨,居然都是意外死亡蚯斯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門饵较,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍嵌,“玉大人,你說我怎么就攤上這事循诉『崃荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵茄猫,是天一觀的道長(zhǎng)狈蚤。 經(jīng)常有香客問我,道長(zhǎng)划纽,這世上最難降的妖魔是什么脆侮? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮勇劣,結(jié)果婚禮上靖避,老公的妹妹穿的比我還像新娘。我一直安慰自己比默,他們只是感情好幻捏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著退敦,像睡著了一般粘咖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侈百,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天瓮下,我揣著相機(jī)與錄音,去河邊找鬼钝域。 笑死讽坏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的例证。 我是一名探鬼主播路呜,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了胀葱?” 一聲冷哼從身側(cè)響起漠秋,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抵屿,沒想到半個(gè)月后庆锦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧葛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搂抒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尿扯。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡求晶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衷笋,到底是詐尸還是另有隱情芳杏,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布右莱,位于F島的核電站蚜锨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慢蜓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一郭膛、第九天 我趴在偏房一處隱蔽的房頂上張望晨抡。 院中可真熱鬧,春花似錦则剃、人聲如沸耘柱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调煎。三九已至,卻和暖如春己肮,著一層夾襖步出監(jiān)牢的瞬間士袄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工谎僻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娄柳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓艘绍,卻偏偏與公主長(zhǎng)得像赤拒,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 在上篇中,我們已經(jīng)討論過如何去實(shí)現(xiàn)一個(gè) Map 了蕉朵,并且也討論了諸多優(yōu)化點(diǎn)鹅颊。在下篇中,我們將繼續(xù)討論如何實(shí)現(xiàn)一個(gè)線...
    一縷殤流化隱半邊冰霜閱讀 7,599評(píng)論 5 41
  • 從三月份找實(shí)習(xí)到現(xiàn)在墓造,面了一些公司堪伍,掛了不少,但最終還是拿到小米觅闽、百度帝雇、阿里、京東蛉拙、新浪尸闸、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,211評(píng)論 11 349
  • Java SE 基礎(chǔ): 封裝孕锄、繼承吮廉、多態(tài) 封裝: 概念:就是把對(duì)象的屬性和操作(或服務(wù))結(jié)合為一個(gè)獨(dú)立的整體,并盡...
    Jayden_Cao閱讀 2,103評(píng)論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法畸肆,類相關(guān)的語法宦芦,內(nèi)部類的語法,繼承相關(guān)的語法轴脐,異常的語法调卑,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 王小虎來的第一天,膽子特別小大咱,萬萬沒想到后來..... 哎呦喂恬涧,我就中了他的坑,看他可憐兮兮的樣子碴巾,我的鐵石心居然...
    華姐姐_09ab閱讀 1,342評(píng)論 0 0