为了便于理解,当时只是通过代码执行顺序说明了异常原因。其实多线程中还会涉及 Java 内存模型,本文就从这方面说明一下。
对比源码
我们先来看看 Java 11 中, add
方法做了什么调整。
Java 8 中 add
方法的实现:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
Java 11 中 add 方法的实现:
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
两段逻辑的差异在于数组下标是否确定:
elementData[size++] = e;
,Java 8 中直接使用size
定位并赋值,然后通过size++
自增elementData[s] = e; size = s + 1;
,Java 11 借助临时变量s
定位并赋值,然后通过size = s +