CopyOnWriteArrayList 介紹
ArrayList是線程非安全的,而Vector或者是使用 Collections顽冶,
可以將 ArrayList 包裝成一個(gè)線程安全的類召夹。
不過(guò)這兩種方法也有很大的缺點(diǎn)岩喷,那就是他們使用的都是獨(dú)占鎖,
獨(dú)占式鎖在同一時(shí)刻只有一個(gè)線程能夠獲取监憎,效率太低纱意。于是CopyOnWriteArrayList 應(yīng)用而生了。
獨(dú)占鎖效率低:采用讀寫分離思想解決鲸阔。
讀操作不加鎖偷霉,所有線程都不會(huì)阻塞迄委。寫操作加鎖,線程會(huì)阻塞
寫線程獲取到鎖类少,其他線程包括讀線程阻塞叙身,這咋辦呢?
當(dāng)我們往一個(gè)容器添加元素的時(shí)候硫狞,不直接往當(dāng)前容器添加信轿,而是先將當(dāng)前容器進(jìn)行 Copy,
復(fù)制出一個(gè)新的容器残吩,然后新的容器里添加元素财忽,添加完元素之后,再將原容器的引用指向新的容器泣侮。
CopyOnWriteArrayList并非一定線程安全
數(shù)組角標(biāo)越界問(wèn)題
http://www.reibang.com/p/fc0ee3aaf2df
比如一個(gè)線程向容器中添加元素即彪,一個(gè)線程來(lái)讀取元素,此時(shí)有第三個(gè)線程進(jìn)行刪除元素操作活尊,
讀線程去讀取容器中最后一個(gè)元素隶校,讀之前的時(shí)候容器大小為i,
當(dāng)去讀的時(shí)候刪除線程突然刪除了一個(gè)元素酬凳,這個(gè)時(shí)候容器大小變?yōu)榱薸-1惠况,
讀線程仍然去讀取第i個(gè)元素遭庶,這時(shí)候就會(huì)發(fā)生數(shù)組越界宁仔。