我们知道 ,hashmap 和 arraylist 是线程不安全的
在多线程环境下有数据安全问题,
当然 我们可以通过Collections的一些方法把他们变成线程安全的,
Collections.synchronizedList(list)
Collections.synchronizedMap(m)
也可以使用Hashtable 和 vector 但是这样子做,性能不太好。
今天主要说的是juc包的并发容器类,使用跟hashmap 和 arraylist 都是一样的,这里不再详述
主要简述下原理
ConcurrentHashMap
一个ConcurrentHashMap由多个segment【默认16个】组成,每一个segment都包含了一个HashEntry数组的hashtable, 每一个segment包含了对自己的hashtable的操作,比如get,put,replace等操作,这些操作发生的时候,对自己的hashtable进行锁定。由于每一个segment写操作只锁定自己的hashtable,所以可能存在多个线程同时写的情况,性能无疑好于只有一个hashtable锁定的情况
CopyOnWriteArrayList【读写分离的的思想】
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;//在新数组上加入新元素
setArray(newElements);//更新原来的数组
return true;
} finally {
lock.unlock();
}
}
public E get(int index) {
return get(getArray(), index); //在原来的数组上读取数据
}
总结:CopyOnWriteArrayList 适合读远远大于写的情况,b毕竟 写的时候会复制整个数组,当数据量比较大的时候耗资源