`
jojo_java
  • 浏览: 93627 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

List在foreach时删除元素快速失败

    博客分类:
  • JAVA
 
阅读更多

package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 测试快速失败模型,不加锁的情况下,在foreach遍历list的时候删除list中的元素 
 * 
 */
public class ListTest {
	private static List<String> list = Collections.synchronizedList(new ArrayList<String>());
	static{
		//初始化List
		for (int i = 0; i < 100; i++) {
			list.add(String.valueOf(i));
		}
	}
	
	
	public static void main(String[] args) {
		/*
		 * 快速失败一:foreach中删除元素
		 */
//		for (String string : list) {
//			System.out.println(string);
//			if(string.equals("50")){
//				list.remove(string);
//			}
//		}
		
		//解决办法
		new Thread(new Runnable(){
			@Override
			public void run() {
				synchronized (list) {
					for (String string : list) {
						System.out.println(string);
						try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}).start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				try {
					Thread.sleep(2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (list) {
					list.remove("50");
				}
			}
		}).start();
		
	}
}
 synchronizedList
public static <T> List<T> synchronizedList(List<T> list)返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步: 

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
 不遵从此建议将导致无法确定的行为。 
如果指定列表是可序列化的,则返回的列表也将是可序列化的。 


参数:
list - 被“包装”在同步列表中的列表。 
返回:
指定列表的同步视图。
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics