java中提供了兩個利用這個機制實現的線程安全集合。java
CopyOnWriteArrayList是線程安全的數組
CopyOnWriteArrayList
使用了一種叫寫時複製的方法,
CopyOnWriteArrayList
時,CopyOnWriteArrayList
的整個add操做都是在鎖的保護下進行的。
public boolean add(E e) { //一、先加鎖 final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; //二、拷貝數組 Object[] newElements = Arrays.copyOf(elements, len + 1); //三、將元素加入到新數組中 newElements[len] = e; //四、將array引用指向到新數組 setArray(newElements); return true; } finally { //五、解鎖 lock.unlock(); } }
因爲全部的寫操做都是在新數組進行的,這個時候若是有線程併發的寫,則經過鎖來控制,安全
若是有線程併發的讀,則分幾種狀況: 多線程
可見,CopyOnWriteArrayList的讀操做是能夠不用加鎖的。
CopyOnWriteArrayList
有幾個缺點: 併發
CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用 性能
CopyOnWriteArrayList透露的思想this
一、讀寫分離,讀和寫分開
二、最終一致性
三、使用另外開闢空間的思路,來解決併發衝突spa