往ArrayList里add了2条数据,翻开xlog日志看也确实是add了2次,但最终只显示了一个,为啥?
咱先看ArrayList的add方法:
咱接下来只看size++,size++编译后 对应的是5条字节码指令:
如果线程1执行了2条指令 线程2开始读取size的值,就会出现ArrayList脏写的问题。问题就是因为线程1还没有执行size的putfiled指令 就连iadd指令也还没有执行,那此时线程2拿到的size仍然没有+1,也就是线程2写入的数据会覆盖线程1写入的数据,size却变成了2。
如果到了扩容的时候,两个线程同时执行扩容的操作 是会crash的,也就是ensure开头的那个方法。