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 - 被“包装”在同步列表中的列表。
返回:
指定列表的同步视图。
分享到:
相关推荐
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...
std::list没有[]函数或Get()函数,又不能总是front()的方式排出,如何遍历获得其中的元素呢?比如 遍历显示元素内容为例 ,用两种方式实现。
低版本IE数组和HTMLCollection元素集合不兼容forEach循环遍历的处理方法 原生JavaScript通过name获取dom元素得到的是 HTMLCollection元素集合 要想循环遍历可以用forEach,但是在低于ie9的版本下不兼容 var list...
测试mybatis里foreach用法,使用于list,array,map,怎么凑字数
改进了linux tailq队列下在遍历时删除多个元素的问题。可以使用TAILQ_FOREACH_SAFE下面进行节点删除操作。不会出现野指针问题
C-FOREACH用法需要遍历的集合放到items中,然后定义一个temp为每次应用到的集合元素,然后设置起步值及叠加步数
java开发
对对Foreach语句测试
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
主要介绍了java 使用foreach遍历集合元素的实例的相关资料,这里提供实例帮助大家理解如何使用foreach 进行遍历,希望能帮助到大家,
一个在迭代时处理添加和删除元素的列表。 此类将在内部跟踪使用foreach关键字,ForEach()方法或GetEnumerator()方法的循环。 与不同,在这些循环中添加和删除元素不会引发异常。 在当前循环位置之后添加元素时...
jstl forEach标签用法详解,里面介绍地非常详细,有实例说明的。
C#中Foreach详细用法讲述了Foreach用法,并以具体事例为基础。
利用foreach循环显示数组所有元素,对foreach循环进行更深了解
java-array-list-foreach
cforEach标签的使用祥解。c:forEach用法的详细介绍。
for foreach测试代码 执行1000000万次字符串遍历操作。
C#中的foreach的一些简单的用法,这个rar中是txt压缩的。希望对大家有点用。谢谢。
主要给大家介绍了关于C#并发实战记录之Parallel.ForEach使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧