java并发编程12-集合的线程安全类

集合的线程安全类

遗留的线程安全类

Hashtable,Vector直接把同步加到方法上 ## 修饰的安全集合 装饰器模式,Syncronize* ## JUC安全集合 ### Blocking型 大部分实现基于锁并提供阻塞的方法 ### CopyOnWrite 在修改的时候会拷贝一份 ### Concurrent 使用CAS优化,使用多个锁,但是是弱一致性,如迭代的时候得到的内容是旧的,求大小未必100%准确,读取也是弱一致性 ## ConcurrentHashMap 细粒度锁

1
2
LongAdder value = concurrentHashMap.computeIfAbsent(word,(key)->new LongAdder());
value.increment();
### HashMap ### 并发死链 在jdk7中链表是头插法,插入16,35,1,得到了1->35->16 线程A准备扩容 e 1->35->16->null , next 35->16->null,然后被中断 线程B扩容完成, 导致链表成了 head->35->1->null, 然后中断 线程A继续扩容 e 1->null, next 35->1->null, 把e插入到next新的位置,得到了head->1->35->1-> 继续扩容 e = 35->1-> next = 1->35-> ,把e插入,得到了head->35->1->35, 这里已经死循环了 ### 丢失数据 jdk8扩容会丢失数据

ConcurrentHashMap 源码

ForwardingNode, 当扩容的时候,我们搬运一次就把老位置上连接ForwardingNode, 当查询来临的时候,就会知道去新的table里面找了, TreeBin, 是红黑树来替换链表,添加值优先考虑扩容而不是转化为红黑树 ???怎么不讲了??