【CodeReview】简述Collections.synchronizedList()的使用

简述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);

发布了49 篇原创文章 · 获赞 46 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/mingtiannihao0522/article/details/102987706
今日推荐