1、copy-on-write 简写cow
Java中一种使用cow模型来实现的并发类是CopyOnWriterArrayList。相比于Vector,它的操作时无需加锁的。之所以有如此功效,采取空间换时间的方法,只在add方法上加锁(synchronized),get操作是无需加锁。
原理:就是对当前数据先copy一份到一个新的数组,然后对新的数组进行赋值操作。这样就可以不影响get读取数据。副本更改完成后就同步数据,但是get操作会出现读取脏数据的可能。
2、基于CAS的ConcurrentHashMap(jdk1.8)
(1)ConcurrentHashMap在jdk1.8中做了巨大的改动,它摒弃了jdk1.6、jdk1.7中分段锁的概念,而是启用一种全新的方式,那就是CAS算法,但是还是沿用了早期的HashMap的底层依然是由“数组+链表+红黑树”的方式;
(2)jdk1.8中ConcurrentHashMap加锁方式不再采用JKD1.7中的重入锁ReentrackLock,而是使用了synchronized。因为jdk1.8对synchronized进行了优化。
(3)虽然底层还是使用数组+链表+红黑树的方式,但是引入了node节点,它包装了Key-value键值对,所有插入ConcurrentHashMap的数据都包装在这里面。对于hash不冲突的key,使用数组来保存Node数据,而每一项node都是一个链表,用来保存hash冲突的node,当链表的大小达到一定程度会转为红黑树,这样就会在冲突数据较多时也会有比较好的查询效率。
3、读写分离之LinkedBlockingQueue(java.util.concurrent包下一个阻塞线程安全队列,底层使用链表实现,先进先出的有序队列,不接受null)
LinkedBlockingQueue设计也是十分精巧,它的全局变量分为三类:
(1)final型 (2)atomic型 (3)普通变量
final型变量,由于声明后就不允许修改,所以自让是线程安全的。而atomic型内部采用CAS模型来保证线程安全。对于普通变量LinkedBlockingQueue中只包含了head与last两个表示队列头和尾。并且私有,外部无法访问。所以LinkedBlockingQueue只需要保证head和last的安全既可保证整个队列的线程安全;LinkedBlockingQueue是先进先出队列,读写会在不同的元素上工作,所以使用了两个可重入锁,巧妙的通过head和last分别加锁,实现读写分离,来实现良好的安全并发特性。