1、集合线程不安全,究竟是什么意思?
集合的线程安全问题发生在多线程下,当一个线程写操作还未完成时,其他线程就来读这个集合的数据,从而导java.util.ConcurrentModificationException异常。
2、怎么解决?
2.1 Llist集合:Vector集合,加了synchronized锁,性能低,禁止使用
2.2 使用Collections工具类的SynchronizedList()方法, 不推荐
2.3 使用CopyOnWriteArrayList,写时复制技术
3、写时复制
每次写操作时(add、set)都会通过生成副本来修改,然后修改后将指针指向修改后的副本,这样就达到了读写分离。
CopyOnWriteArrayList add()源码CopyOnWriteArrayList set()源码
每次往容器内添加元素时,不直接往当前的容器内添加,而是先将当前的容器进行拷贝,然后再复制出一个新的容器,长度为原来的长度加1,然后将添加的蒜素添加到新容器的最后一个位置上,然后把原来的引用指向新的容器。
这样的好处,写的过程中可以并发的读,而不需要加锁,属于读写分离的思想。
网友评论