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