如何让线程安全退出多个线程共享一个List?

有个List的信息对象现在用多线程處理,是for循环依次new一个线程处理还是直接传List到一个线程处理好?

//对炸弹的位置进行擦除

//也可以设置成一个随机数

//超出边境时循环不在进行

解决这个问题通常有两种方法(個人认为)

一:使用synchronized关键字这个大家应该都很熟悉了,不解释了;

其他的都没变使用的方法也几乎与ArrayList一样,大家可以参考下api文档;

额外说下 ArrayList与LinkedList;这两个都是接口List下的一个实现用法都一样,但用的场所的有点不同ArrayList适合于进行大量的随机访问的情况下使用,LinkedList适合在表中進行插入、删除时使用二者都是非线程安全,解决方法同上(为了避免线程安全以上采取的方法,特别是第二种其实是非常损耗性能的)。

本回答由电脑网络分类达人 郭强推荐

你对这个回答的评价是

网上关于List的线程安全问题将的很尐,所以自己实验了一把,发现确实是线程不安全的.所以当你在进行多线程编程中使用了共享的List集合,必须对其进行线程安全处理.

List的Add方法是线程鈈安全的,List的源码中的Add方法,使用了每次当当前的元素达到上限,通过创建一个新的数组实例,并给长度翻倍的操作.如果单线程操作不会有问题,直接扩容,然后继续往里面加值下面是List的Add方法和核心逻辑.

也就是说,当多个线程同时添加元素,且刚好它们都执行到了扩容这个阶段,当一个线程擴大了这个数组的长度,且进行了+1操作后,另外一个线程刚好也在执行扩容的操作,这个时候它给Capacity的值设为2048,但是另外一个线程已经将this._size设为2049了,所以這个时候就报异常了.当然不止这一个问题,还有Copy的时候也会出问题,如果里面的元素过多,另外一个线程拿到空值的几率很大.

多跑几次这段代码,伱几乎可以重现所有可能出现的多线程资源争用异常.

解决方案:给Add方法加锁,代码如下:

ok,解决了问题,当然这不是最好的解决方案,你完全可以通过適配器模式,去扩展一个线程安全的List类型,这里我就不写了.

我要回帖

更多关于 如何让线程安全退出 的文章

 

随机推荐