与HashMap、SynchronizedMap的差别
1 | 1.HashMap线程不安全 |
JDK1.7的实现方式
1 | 1.segment数组 -> HashEntry数组 -> HashEntry列表 |
JDK1.8的实现方式
1 | 1.以node数组加列表或红黑树的方式实现 |
Node对象
1 | 1.val与next都会在扩容时发生变化,所以使用了volatile来保持可见性和禁止重排序 |
JDK1.8中put的实现细节(含CAS原理)
1 | 1.如果Node数组为空,则调用initTable方法初始化Node数组 |
CAS
1 | 1.Compare And Swap, CAS有三个参, 分别是V, E, N (CAS(V, E, N)),如果V等于E,则将V设为N;如果V和E不相同,说明已有其他线程做了更新,当前线程什么都不做或更改V,E和N的参数再重试 |
JDK1.8中get的实现细节
1 | 计算key的hash值,如果Node数组中匹配到首结点即返回,否则调用next方法遍历链表或红黑树,由于可能会存在冲突,需要调用equals方法进行判断 |
volatile实例
1 | 1.容纳Node的数组和表示长度的变量都是volatile修饰的,设计动机: 多个线程并发操作,一个线程更改完成后,通过volatile保证线程间的可见,其他线程能够立刻感知到当前线程的更改 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 123!