日期:2014-05-20  浏览次数:20761 次

多线程处理集合对象~求解
需求:
从某时刻起,启动一组线程去完成某项任务,线程是同时并发执行的,现在存在一个对象a,对象a中存在属性List对象b,在创建每个线程的时候会传入同一个对象a,然后在线程中调用a的一个方法(该方法的作用是向list对象b中添加数据),整个过程中都是向list集合添加数据,没有移除数据的操作.

问题:1、这种方式会不会引起线程安全的问题,即多个线程在向同一个list对象中插入数据的时候,会不会导致有的数据因为线程安全的问题而没有插入list中?

  2、如果有线程安全的问题,用List的vector实现类,会不会解决线程安全问题?

------解决方案--------------------
1.如果你用ArrayList在做,肯定需要程序员自己加锁来实现线程的同步
2.如果用Vector做,因为原来的sun实现Vector的时候已经实现了同步机制,所以官方介绍都说是“线程安全”的,因此程序员不需要自己再加锁保证线程同步了

------解决方案--------------------
会。貌似java5以后有CopyOnWriteArrayList是线程安全的,Vector不是很常见(它是个线程安全类,但是效率不知道如何)。
------解决方案--------------------
如果你的list不是线程安全集合,肯定是需要同步的,否则可能破坏数据结构。
vector不建议使用了(可能是由于所有方法都是synchronzied的效率太低,不如由客户端根据情况自己实现同步)。
就算使用了vector也需要线程同步,如:
 for (int i=0; i<list.size(); i++) {
doSomething(list.get(i));
}
List.size() 的结果在循环的执行期间可能会变得无效,因为另一个线程可以从这个列表中删除条目。如果时机不得当,在刚好进入循环的最后一次迭代之后有一个条目被另一个线程删除 了,则 List.get() 将返回 null ,而 doSomething() 则很可能会抛出一个 NullPointerException 异常。

所以像vector这样的集合又称为有条件的线程安全类。
------解决方案--------------------
ls说的都挺好,如果不想自己加锁就可以考虑vector。

自己写锁也可以!
------解决方案--------------------
探讨

我这里只有向list中添加数据的操作,没有读取或移除的操作,不知道多个线程同时向list中添加数据,会不会出现有的数据没有被添加到list中?

------解决方案--------------------
没看懂什么需求。
不这list本不是同步的,如果你怕list发生线程不安全,你可以在添加方法上加锁synchnizad。
这样子就不会发生两个线程同时增加,影响线程安全拉
------解决方案--------------------
arraylist不是线程安全的!就你的业务来说的,有可能出现数据被覆盖的可能!
------解决方案--------------------
探讨

会。貌似java5以后有CopyOnWriteArrayList是线程安全的,Vector不是很常见(它是个线程安全类,但是效率不知道如何)。

------解决方案--------------------
会有问题,可以自己在共享的代码段前加synchronized,自己处理。
------解决方案--------------------
新并发包中的免锁容器都比较好用的