JDK源码分析

ThreadLocal

精华1

每个线程对应一个 threadLocalMap (threadLocal的公共内部类)

t.threadLocals = new ThreadLocalMap(this, firstValue);
//this就是key  就是自己声明的threadlocal

threadLocalMap的key是 自己声明的 threadlocal; 也就是说每个线程的threadLocalMap的key是一样的,但是threadLocalMap不一样;

精华2

threadLocalMap里面有entry[] ;能存放多个threadLocal; 也就是说一个线程上下文中可以声明多个threadLocal 初始大小16个

int i = key.threadLocalHashCode & (len-1); // 定位当前threadLocal在entry[]的index;

if (k == key) { //遍历entry[], 只要数组中的threadLocal和传过来的threadLocal相等就设置值
e.value = value;
return;
}

ArrayList

public ArrayList() {
    // 直接将空数组赋给elementData
    this.elementData = {}
}

2 扩容

int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);

3 toArray

    public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
实际是
System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));

4 modCount

private class Itr implements Iterator<E> {
        int expectedModCount = modCount;//迭代过程不运行修改数组,否则就抛出异常

}
expectedModCount的初值为modCount

hasNext的判断条件为cursor!=size,就是当前迭代的位置不是数组的最大容量值就返回true

next和remove操作之前都会先调用checkForComodification来检查expectedModCount和modCount是否相等

private class SubList extends AbstractList<E> implements RandomAccess {}

HashMap

线程池

posted @ 2021-08-18 11:13  AlbertXe  阅读(91)  评论(0编辑  收藏  举报