源码 一月 20, 2020

并发编程之ThreadLocal解读

文章字数 5.6k 阅读约需 5 mins.

ThreadLocal实例的弱引用对象会作为key存放在ThreadLocalMap中,然后set方法加入的值就作为ThreadLocalMap中的value。它提供了线程本地变量,可以保证访问到的变量属于当前线程。

private final int threadLocalHashCode = nextHashCode();

//用于计算threadLocal的hash值,每个对象一直递增
private static AtomicInteger nextHashCode =
    new AtomicInteger();

// 黄金分割数 使散列更加均匀
private static final...
查看全文

源码 十二月 15, 2019

源码系列-ConcurrentHashMap源码

文章字数 17k 阅读约需 15 mins.

JDK1.8 的实现摒弃了Segment的概念,直接用Node数组 + 链表 + 红黑树的数据结构来实现,并发控制使用SynchronizedCAS来操作,

用来控制table的初始化和扩容的操作,不同的值有不同的含义。

  • table未初始化时:sizeCtl = 0或者 sizeCtl= capacity;
  • table正在初始化:sizeCtl = -1;
  • table初始化完成:sizeCtl = thresold;
  • 当sizeCtl = − (1 + N),表明正在有N条线程正在进行resize...
查看全文

源码 十月 23, 2019

源码系列-HashMap源码

文章字数 10k 阅读约需 9 mins.

首先看一下Map家族四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap。

下面我们主要解读HashMap,结合源码,从存储结构、常用方法分析、扩容以及安全性等方面深入解读HashMap的工作原理。

从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示:

引入了红黑树是因为它查找、插入、删除的平均时间复杂度为O(log(n))。这是因为当产生hash碰撞时,数据会挂载(尾插),形成链表。链表空间...

查看全文
0%