緩存是集合框架
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
馬克-to-win:在實(shí)踐當(dāng)中,有很多數(shù)據(jù)并不是像火車票數(shù)或者賬戶余額這樣的關(guān)鍵數(shù)據(jù)(存在的意義就是為了瘋狂的加減,瘋狂的變化)。它們只是普通數(shù)據(jù)庫(kù)表的一個(gè)緩存而已。比如淘寶網(wǎng)中展示的衣服數(shù)據(jù),基本不變,即使變了,不實(shí)時(shí)準(zhǔn)確的展示最新的,也不會(huì)引起災(zāi)難性的后果,不像銀行賬戶或火車票數(shù)。馬克-to-win:這種數(shù)據(jù)我們就考慮放在集合框架當(dāng)中。我們的備選方案有1)Hashtable,2)HashMap,3)Collections.synchronizedMap(new HashMap())或4)ConcurrentHashMap()。
i)HashTable:
馬克-to-win:HashTable本身是 synchronized。換句話說(shuō),HashTable的類里面用很多synchronized關(guān)鍵字來(lái)保證線程安全。在高并發(fā)情況下, HashTable的效率非常低下。另外,一個(gè)線程往Hashtable添加(put)元素,同時(shí)另一個(gè)線程讀數(shù)據(jù)會(huì)引起 ConcurrentModificationException異常。這叫fast-fail(快速失敗,失敗越快,錯(cuò)誤越小)
ii)HashMap
馬克-to-win:和Hashtable相比,HashMap是線程不安全的。Hashtable的并發(fā)低效,HashMap是沒(méi)有了。但線程安全的問(wèn)題,你得時(shí)刻謹(jǐn)記在心。在你自己的線程里面,該加synchronized的地方一定得加。和Hashtable一樣,一個(gè)線程往 HashMap添加(put)元素,同時(shí)另一個(gè)線程讀數(shù)據(jù)也會(huì)引起ConcurrentModificationException異常。
iii)Map map = Collections.synchronizedMap(new HashMap());
馬克-to-win:網(wǎng)上有一種觀點(diǎn)認(rèn)為:它的實(shí)現(xiàn)原理是Collections定義了一個(gè)所謂的SynchronizedMap的內(nèi)部類(所以我們看不到這個(gè)類),這個(gè)類實(shí)現(xiàn)了Map接口,它里面的方法冠以synchronized來(lái)保證線程同步。這樣就達(dá)到了這樣一個(gè)目的:非并發(fā)環(huán)境,用HashMap,并發(fā)環(huán)境用Collections.synchronizedMap(new HashMap())。但它的官方文檔說(shuō)還是有很多限制,比如訪問(wèn)時(shí),還是得用同步塊。說(shuō)穿了還是不適合并發(fā)環(huán)境用。最致命的就是:一個(gè)線程添加 (put)元素,同時(shí)另一個(gè)線程讀數(shù)據(jù)也會(huì)引起ConcurrentModificationException異常。