concurrentHashMap put方法处理并发
concurrentHashMap存储结构
- 首先是一个数组,用于通过hash值得到index,定位到某个node
- 数组每个node都存着一个链表,或是红黑树
- 插入时首先计算index,然后插入table[index]链表末尾/或者插入红黑树
- 并发时锁的粒度在Node<k,v> f = table[index],即锁住整个链表/红黑树
put方法如何处理并发问题?
采取的方法是锁住链表头节点/红黑树根节点
与service-cache的异同
- 在锁的粒度上没有太大的区别
- 都是用key算出index,然后锁住index代表的节点/loadingHolder
- 锁住的节点或者loadingholder实际上锁住了一组key(即计算index得到同一个值的所有key)
- service-cache load是只让一个线程去load,然后写到缓冲区,让其他线程直接读
- concurrentHashMap则是控制并发写入,只是做了加锁,最终还是会让每个线程都进入进行操作