ConcurrentHashMap

ConcurrentHashMap 的基本实现逻辑与 Post not found: HashMap 相似,数组 + 链表 + Post not found: 红黑树

  1. 历史版本

    注:ConcurrentHashMap ==在 jdk1.5 上引入的,在 jdk1.8 中出现源码变动。==
    在 jdk1.5 到 jdk1.7,ConcurrentHashMap 底层数据结构是 Segment 数组组成,每个 Segment 类似于一个 HashTable。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /**
    * Stripped-down version of helper class used in previous version,
    * declared for the sake of serialization compatibility
    */
    static class Segment<K,V> extends ReentrantLock implements Serializable {
    private static final long serialVersionUID = 2249069246763182397L;
    final float loadFactor;
    Segment(float lf) { this.loadFactor = lf; }
    }

    Segment 继承于 Post not found: ReentrantLock ,在 put 操作时,先根据 hash 计算索引定位到具体的 Segment,然后在操作时只需要锁住相应 Segment 就可以了。

阅读更多

Collections. SynchronizedList ()、CopyOnWriteArrayList 与 Vector 有什么区别?

Collections. SynchronizedList ()CopyOnWriteArrayListVector 都是线程安全的集合。

  1. Vector

    Vector 的同步做法是给所有公有方法都加上 “Synchronized”[^1] 关键字。

    1
    2
    3
    4
    5
    6
    7
    8
    //Vector
    public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
    }

阅读更多

Java集合

  1. Java 集合关系

  
整体上集合分为 CollectionMap, 所有集合的实现类都要实现其中一个。

阅读更多

checkForComodification

1
2
3
4
5
6
7
8
9
10
11
12
//执行这段代码是会抛出异常 ConcurrentModificationException
for (String str : list) {
if ("remove".equals(str)) {
list.remove(str);
}
}

//具体位置
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
阅读更多