java多线程同时向一个数组arraylist添加元素,遍历这个集合

java多线程同时向一个数组arraylist添加元素,遍历这个集合,第1张

ArrayList集合是不行的,如果多线程同时添加元素,有可能产生线程安全问题,程序也有可能报错。

例如:一个线程正准备往进去写数据,突然切到另一个线程它先写了进入,在切回来这个线程并不知道这个位置已经写入了数据,所以它还是会傻傻的写入数据,这样另一个线程的数据就被覆盖了。如果是一边添加 ,一边遍历的话程序会产生ConcurrentModificationException异常。

所以要用copyonwritearraylist是最好的选择,但是注意的是,添加元素时它的性能不是很好 。

按照图中的节点数据,我做了一个小案例,如下:

JavaScript代码:

var ul1 = document.querySelectorAll('#ul1 a'),

    ul2 = document.querySelectorAll('#ul2 li')

for (var i = 0 i < ul1.length i++) {

    var a = document.createElement('a')

    a.setAttribute('href', ul1[i].getAttribute('href'))

    ul2[i].appendChild(a)

}

运行结果:

list集合有个特点,比如说一个list里面有三个元素a,b,c,对应的索引分别是0,1,2。当调用remove(0)时,list会移除a这个元素,这个时候list里面的元素就变成b,c,对应的索引值分别为0,1。这个时候list的size已经变成了2,但是如楼主的for循环的话,循环的上限还是最开始的list的size值,也就是3。如此下去每移除一个元素的时候,list的索引取值范围都会变小,最后如果remove(i)中i的值超出了当前集合的范围了,就会报异常


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11938856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存