跳表的实例:jdk中的ConcurrentSkipListMap、ConcurrentSkipListSet,以及Redis,levelDB
CopyOnWriteArrayList并发安全。修改时会先lock, 然后 copy完整的数组,在这份复制的数组中进行修改,再把数组的引用指向此新数组。读方法未进行同步控制。所以有线程写数组时,读线程也不会阻塞,只是读到的是旧数组的数据。CopyOnWriteArrayList反映了读写分离的思想。
它对比读写锁的优点:读写锁的写是独享的,即读写互斥。而CopyOnWriteArrayList读写不互斥。
我的引申:
思想 | 并发程度 | 并发特点 | 例子 |
---|---|---|---|
完全互斥 | 最低 | hashtable | |
读写锁 | 中 | 仅读读相容,读写、写写皆互斥 | java中的读写锁;数据库锁的相容矩阵 |
读写分离 | 最高 | 读读、读写相容,仅写写互斥 | CopyOnWriteArrayList;数据库的主从;Redis的主从 |
注意:ConcurrentHashMap的并发程度、并发特点与上表第三行差不多,但是底层原理不一样,详见CopyOnWriteArrayList vs Vector 类似于 ConcurrentHashMap vs HashTable