在前不久的开发工作中接触到了并发容器中的cow并发容器,所以这里就并发容器做一个简单的总结。
首先,并发容器按实现原理分为以下几种:
1.copy-on-write,比如:CopyOnWriteArrayList,CopyOnWriteArraySet
在需要往集合中添加元素时,首先复制一个新的集合对象,添加操作在新的集合对象上进行。在操作完成后,将原集合对象指向新的集合对象。即添加时复制。
这种方式需要注意对内存的占用问题,毕竟每次写操作都要复制一份出来,如果原集合太大,那么占用的内存会难以想象。
因为它的特点,所以它一般使用在小容量的多读少写的场景。
2.分段锁,比如:ConcurrentHashMap
ConcurrentHashMap使用的分段锁机制。相对于HashMap,ConcurrentHashMap中有一个段的结构segment。每个segment都继承了ReentrantLock(重入锁),那么每个段都可以灵活的进行加锁释放锁的操作。这样就实现了灵活的分段锁结构,只要修改的数据不再同一个段上,那么就可以支持并发的写操作。
3.CAS,即比较和替换,比如:ConcurrentLinkedQueue
ConcurrentLinkedQueue属于一种非阻塞链表,在要插入数据时,会调用sun.misc.Unsafe中的一个compareAndSwapObject方法。其原理是,当需要修改值时,先比较期望值与当前值是否一样(期望值来自进行修改操作之前取到的值)。这样如果在进行修改操作之前有其他的线程修改了数据,那么期望值与当前值显然不同,就放弃本次的修改操作,从而避免了多线程的并发冲突。因为其实现过程没有使用锁,所以性能在并发不高的时候是优于锁的。
4.使用锁去实现,比如:ArrayBlockingQueue
这是最好理解的一种,比较直接,直接用锁去解决并发的问题。但是其性能相对以上几种,只有在高并发的情况才有较好的性能收益。
并发容器涉及到很多的并发相关的知识,随便拿出一个类都可以单独讲一下。这里只是针对并发容器的几个原理做一个简单的介绍。如有错误的地方,欢迎提出来。之后有时间再针对其中的一些常用类进行详细的介绍。