### ConcurrentHashMap
> CAS + synchronized 控制并发操作
#### sizeCtl
> 0 默认值
> -1 代表正在初始化
> >0 表示阈(yu)值
> < -1 多个线程正在进行扩容
#### 与hashMap区别
> 初始化:使用CAS的保证只有一个线程能进行初始化
> 增加元素:如果桶是空的,通过CAS放入新值
> 如果发现正在扩容,则需要帮助扩容
> 帮助扩容的时候,需要判断当前桶是不是正在扩容,如果不是的话,
> 如果桶不是空的,锁住桶的头节点,开始插入;再分是链表还是红黑树。
1. 当 Cmap 尝试插入的时候,发现该节点是 forward 类型,则会帮助其扩容。
2. 每次加入一个线程都会将 sizeCtl 的低 16 位加一。同时会校验高 16 位的标示符。
3. 扩容最大的帮助线程是 65535,这是低 16 位的最大值限制的。
4. 每个线程默认分配 16 个桶,如果桶的数量是 16,那么第二个线程无法帮助其扩容。
- 虚拟机
- JVM内存结构
- JVM调优手段
- java对象生命周期
- 垃圾回收判断对象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基础知识
- java事件机制
- java反射机制
- jvm创建对象
- java异常
- finally语句一定会执行吗?
- 集合类介绍
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多线程
- 为什么要使用线程池
- 线程死锁
- 死锁检测和解除
- jstack
- jconsole
- 死锁预防
- 常见线程池
- 线程池参数
- 工作队列介绍
- 拒绝策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis数据结构
- redis hash实现
- redis rehash与hashmap扩容的区别
- Redis使用场景
- Redis为何这么快
- redis连接数不足导致错误
- 分布式
- 分布式事务
- ACID
- CAP
- BASE
- 事务隔离性
- 一致性哈希算法
- 负载均衡算法
- Hystrix 信号量和线程池隔离的差异
- Spring Cloud
- eureka
- MYSQL
- mysql优化经验
- undo redo binlog
- web
- http协议
- http和https区别
- Cookie和session
- TCP三次握手、4次挥手
- TCP的time_wait和close_wait
- 算法问题
- 编辑距离算法
- MQ
- RabbitMq
- Kafka
- 安装教程
- Win ELK安装