ArrayList、CopyOnWriteArrayList读写、迭代器、subList

1.关于ConcurrentModificationException和迭代器读写(ArrayList)
a) foreach语法底层其实是使用了iterator。
b) ArrayList在remove/add时会修改一个变量modCount。
c) ArrayList的迭代器是其一个内部类,在创建这个迭代器对象时,它保留了当时的modCount的值,在调用迭代器方法时,会先检测ArrayList.modCount和快照是否相同如果不相同则抛出ConcurrentModificationException。
d) ArrayList的set方法不会修改modCount,所以在迭代器迭代时可以调用set
e) ArrayList的迭代器的remove/add方法内部是调用ArrayList的remove/add,同时更新了自己的modCount快照,所以迭代器修改会造成其他迭代器的ConcurrentModificationException
f)所以for(int i = 0; i < size; i++)不会造成ConcurrentModificationException


2.关于锁和读写(CopyOnWriteArrayList)
a) 所有读的方法和ArrayList没区别,都是直接从源数组里直接随机读取
b) 所有修改的方法add/remove/set/clear共享一把lock
c) add/remove/set都是基于Arrays.copyOf(),产生一个新数组,再将源数组array指向新的数组对象
e) 没有modCount
d) 为什么加写锁了还要复制 -> 为什么写锁要和读锁互斥 -> 64位long型对于32位JVM要写两次,是不保证原子性的,这就可能读到只写了一半的long型(虽然现在虚拟机都实现的long/double的原子性操作,但是jvm规范并没有要求)
f) 所以可以认为CopyOnWriteArrayList是用写时复制代替了读锁,把读的复杂度移到了写时,所以适合读多写少的业务
d) addIfAbsent() 如果没有则添加,CopyOnWriteArraySet内部其实是CopyOnWriteArrayList,add方法调用了CopyOnWriteArrayList#addIfAbsent


3.关于迭代器和UnsupportedOperationException(CopyOnWriteArrayList)
a) CopyOnWriteArrayList的迭代器是其一个内部类,在创建这个迭代器对象时,他保留了当时的源数组,迭代是基于当时快照的,所以对CopyOnWriteArrayList的迭代可能是旧的数据
b) 迭代器代表的是一个过时的数组,所以对过时数组的修改是没有意义的,所以迭代器的修改方法直接抛出UnsupportedOperationException
c) 因为没有modCount所以foreach迭代时可以随便修改list,但是要忍受迭代的过期数据


4.关于subList
a) 对subList的读写其实都是委托源List,所以subList可以看成对index的附加约束
b) CopyOnWriteArrayList的subList是其一个内部类,在创建subList对象时,保留了源list当时的内部array的引用,在之后调用subList的方法时,会校验list的array是否改变如果改变则抛出CopyOnWriteArrayList,而通过subList修改源list后,subList会更新保留的array引用,类似ArrayList的迭代器修改
c) ArrayList的subList是其一个内部类,行为都相似,不过他是通过modCount来做同步校验的,和ArrayList.Iterator基本相同


5.关于扩容
a) CopyOnWriteArrayList在修改时产生新的、大小正好的数组,所以没有扩容问题
b) ArrayList当array剩余空间不足时进行扩容,扩容后的容量是原来的1.5倍,不超过Integer.MAX_VALUE,没有loadfactor这一说


6.关于System.arraycopy和Arrays.copyOf
a) 关于数组的操作上是靠这两个
System.arraycopy(fromArr, fromIndex, toArr, beginIndex, len)
add(int index, Object element):
System.arraycopy(elementData, index, elementData, index + 1, size - index)
elementData[index] = element
remove(int index):
System.arraycopy(elementData, index+1, elementData, index, size - index - 1)
elementData[--size] = null
b)Arrays.copyOf()其实内部是new了一个新的数组,并调用System.arraycopy()把数据写入新数组再返回

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Java源码研究之容器(1) 如何看源码 很多时候我们看源码, 看完了以后经常也没啥收获, 有些地方看得懂, 有些...
    骆驼骑士阅读 981评论 0 22
  • ArrayList 源码分析 不知道各位朋友,还记得开工前制定的学习目标么? 有没有一直为了那个目标废寝忘食呢?继...
    醒着的码者阅读 1,362评论 5 11
  • 本文基于JDK1.8在看dubbo的时候,看到使用了CopyOnWriteArrayList,顺带了解下 Arra...
    土豆肉丝盖浇饭阅读 306评论 0 1
  • 感恩养育孩子的辛苦,洗衣做饭家务,辅导孩子作业,户外活动,样样需我亲力亲为,真的很挑战体力和耐心,看到乱放的衣服,...
    寸心洁白阅读 262评论 0 2
  • 溜滑梯 休闲璐提到聚会席间人人怀疑自己有抑郁症而不去查,这我是信的。抑郁就像个噬魂怪,不存在又存在,杀人于无形;还...
    逢凶化吉满天杀阅读 200评论 0 0