简述Collections.synchronizedList()的使用
code
// 进场动效队列集合
private List<IEffect> list_effect = Collections.synchronizedList(new ArrayList());
/**
* 方法:进场动效播放方法
*/
public synchronized void onEffect() {
if (list_effect.size() > 0) {
isEffectAnim = true;
loadAnimation(list_effect.get(0), new EffectCallback() {
@Override
public void onFinished() {
onEffect();
}
});
} else {
isEffectAnim = false;
}
}
ArrayList
ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.
Vector
Vector是一个线程安全的List,但是它的线程安全实现方式是对所有操作都加上了synchronized关键字,这种方式严重影响效率(死缓).所以并不推荐使用Vector.
Collections.synchronizedList(List list):
返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步
List list = Collections.synchronizedList(new ArrayList());
list.add("1");
list.add("2");
list.add("3");
synchronized (list) {
Iterator i = list.iterator();
while (i.hasNext()){ // Must be in synchronized block
System.out.println(i.next());
}
}
synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,因为在整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list);