专注于Java、Golang、软件架构、项目管理

Back

CopyOnWriteArrayList#

写时复制的并发Arraylist容器,底层使用锁来实现

底层使用volatile标记array,保证并发修改后能立即可见。

另外使用ReentrantLock在进行写操作时加锁

/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;
/** The lock protecting all mutators */
final transient ReentrantLock lock = new ReentrantLock();
java

所有的读操作(get,迭代器,contains)都是读的array快照,弱一致性模型

优点:线程安全,读写不互斥

缺点:若一致性,每次修改都要新建一个数组。空间浪费大,增加gc压力

ConcurrentLinkedQueue#

无界队列,底层使用单向链表实现,无大小限制。所有的指针操作都是基于CAS,没成功则进入下次循环直到成功。

不停的往此队列插入数据,可能会导致内存溢出。

此容器使用CAS保证并发安全,但size是弱一致性的

LinkedBlockingQueue#

有界队列,底层使用单向链表实现,有大小限制,超过了限制,往队列里插入数据就会阻塞住。可以限制内存队列的大小,避免内存无限制的增长,最后撑爆内存

底层使用2个锁提高并发能力:take锁与put锁,以及各自的Condition。如下图所示

take的时候,若为空则阻塞等待,容器非空时再take数据

put的时候,若满则阻塞等待,容器不满再put数据

ArrayBlockingQueue#

基于环形数组实现的有界队列

底层使用一个锁,2个condition。其余与LinkedBlockingQueue的原理大致一致