ArrayList(線程不安全) --->????CopyOnWriteArrayList(線程安全项乒,讀操作時(shí)在原有數(shù)據(jù)上讀)
????字面意思:寫操作時(shí)復(fù)制郊尝。當(dāng)對ArrayList進(jìn)行寫操作時(shí),它先將原有數(shù)組拷貝一份响迂,然后再新的數(shù)組上進(jìn)行寫操作喂走,寫完之后再將原來的數(shù)組指向新的數(shù)組呼胚。
? ? CopyOnWriteArrayList的add操作都是在鎖(如圖一,鎖的概念可以回顧之前寫的)下進(jìn)行的张惹,這樣做是為了在并發(fā)操作時(shí)復(fù)制多個(gè)副本輸出搞亂數(shù)據(jù)舀锨,導(dǎo)致最終數(shù)據(jù)不是自己期望的值。
? ? 缺點(diǎn):????因?yàn)樵趯懖僮鲿r(shí)需要拷貝副本宛逗,消耗內(nèi)存坎匿。
? ? ? ? ? ? ? ? ? ?不能用于事實(shí)讀的場景,所以適合讀多寫少的場景雷激。
? ? 設(shè)計(jì)思想:? ? 讀寫分離替蔬,最終一致性,使用時(shí)開辟空間屎暇,解決并發(fā)沖突
其他:
HashSet????????->????CopyOnWriteArraySet
TreeSet? ? ????->? ? ?ConcurrentSkipListSet
HashMap? ? ?->? ? ? ConcurrentHashMap
TreeMap? ? ? ->? ? ? ?ConcurrentSkipListMap
如何達(dá)到共享對象安全
? ? ? ? 線程限制:一個(gè)被線程限制的對象承桥,由線程獨(dú)占,并且只能被占有它的線程修改
? ? ? ? 共享只讀:一個(gè)共享只讀的對象根悼,在沒有同步的情況下快毛,可以被多個(gè)線程并發(fā)訪問,但不可以修改
? ? ? ? 線程安全對象:一個(gè)線程安全的對象或者容器番挺,在內(nèi)部通過同步機(jī)制來保證線程安全唠帝,所以其他線程無需額外的同步就可以通過公共接口隨意訪問它
? ? ? ? 被守護(hù)對象:被守護(hù)對象只能通過獲取特定的鎖來訪問