`
jojo_java
  • 浏览: 96446 次
  • 性别: 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 - 被“包装”在同步列表中的列表。 
返回:
指定列表的同步视图。
 
分享到:
评论

相关推荐

    Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    问题的根源在于,foreach 标签在生成 SQL 语句时,会将集合对象的每个元素用逗号分隔,并且在每个元素之间添加空格、换行、回车符号。这些符号会导致 SQL 语句执行失败或返回错误的结果。 解决方案是使用 replace ...

    集合框架的使用方法

    2. 删除元素:remove() 方法移除指定元素,clear() 方法清空整个集合。 3. 访问元素:get() 方法根据键获取值,contains() 检查是否包含特定元素。 4. 遍历:迭代器(Iterator)是遍历集合的主要方式,也可使用...

    02-Java集合容器面试题(2020最新版)-重点.pdf

    - **Iterator/foreach**:适用于所有集合类型,支持在遍历过程中删除元素。 - **最佳实践**:根据具体需求选择合适的方法,对于频繁的增删操作推荐使用`Iterator`。 #### 十六、ArrayList详解 - **优点**:查询速度...

    CSharp-Custom-List:鲁斯特大学将军校名单-IFRO Trabalho para universidade do IFRO

    4. **方法**:包括添加元素(Add),插入元素(Insert),删除元素(Remove),查找元素(Find),以及对列表进行排序(Sort)等操作。 5. **枚举器**:实现IEnumerator接口,以便可以使用foreach循环遍历列表中的所有元素。 ...

    2021-2022计算机二级等级考试试题及答案No.12558.docx

    - **解释**:在数据库操作中,RECALL命令用于恢复被删除的记录,但不会改变当前的记录指针位置,因此正确答案是RECALL。而LIST命令会列出所有记录,SUM命令用于计算数值字段的总和,REPLACEALL命令则会替换满足条件...

    jquery ajax无刷新技术

    - `error`:请求失败时执行的回调函数,参数`jqXHR`, `textStatus`, `errorThrown`分别表示错误的XMLHttpRequest对象、状态和错误信息。 ### 7. JSON2.js 在旧版浏览器中,不支持原生的JSON解析和序列化。`json2....

    Javascript技巧大全

    - **添加/删除类**:使用`.classList.add()`、`.classList.remove()`等方法控制元素的CSS类,从而改变元素的样式。 - **事件监听**:通过`addEventListener()`和`removeEventListener()`方法为元素绑定和移除事件...

    迭代器测试

    测试用例应该覆盖各种操作,包括正常遍历、中间删除元素、遍历空集合、修改集合时遍历等。 7. **断言**:在测试中,使用断言(如JUnit的`assertEquals()`、`assertNull()`等)来验证迭代器行为是否符合预期。例如,...

    ajax实现改变状态和删除无刷新的实例

    另外,AJAX请求可能会因为各种原因失败(如网络问题),所以前端代码中需要有异常处理逻辑,以确保用户在遇到错误时能够得到明确的反馈。 #### 10. AJAX的优势与应用场景 AJAX最大的优势在于提供一种更为流畅的用户...

    ajax-crud:只需使用ajax插入更新删除

    **Ajax CRUD操作详解** 在现代Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于实现页面的无刷新更新,极大...这种方式提高了Web应用的交互性和效率,使得用户在等待数据处理时能有更流畅的体验。

    php+redis实现注册、删除、编辑、分页、登录、关注等功能示例

    在Redis中,可以使用`LRANGE`命令获取List中的部分元素,实现分页。在`list.php`中,我们计算总页数,根据当前页码获取相应的用户ID,然后使用`HGETALL`获取对应用户的所有信息。 ```php // list.php简化版 $page_...

    TCL语言教程

    - **错误发生**:当命令执行失败时会产生错误。 - **错误信息**:使用`error`命令获取错误详细信息。 ##### 从TCL脚本中产生错误 - **主动抛出错误**:使用`error`命令主动抛出错误。 ##### 使用catch捕获错误 - *...

    C#实现自定义Dictionary类实例

    在C#编程中,`Dictionary, TValue&gt;`是.NET框架提供的一个非常重要的数据结构,它实现了键值对的存储,提供了快速访问、插入和删除操作。然而,有时我们需要根据特定需求自定义`Dictionary`类来扩展其功能或优化性能...

    java 集合并发操作出现的异常ConcurrentModificationException

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...

    Lista_de_Productos

    2. **DOM操作**:Document Object Model (DOM) 是HTML和XML文档的结构化表示,JavaScript通过DOM API可以操作页面元素,如添加、删除、修改元素,或者获取元素的属性和内容。 3. **AJAX**:Asynchronous JavaScript...

    Java面试题精选与解析.md

    - 使用迭代器(Iterator)遍历集合,更灵活且支持在遍历过程中删除元素。 #### 五、多线程与并发 - **线程的创建和生命周期**: - 创建线程可以通过继承`Thread`类或实现`Runnable`接口来实现。 - 线程的生命...

    计算机c#总复习资料

    - **列表(List)**:类似于动态数组,支持快速插入和删除元素。 - **队列(Queue)**:遵循先进先出(FIFO)原则的数据结构。 - **栈(Stack)**:遵循后进先出(LIFO)原则的数据结构。 - **字典(Dictionary, ...

    美图-PHP笔试题.docx

    - **原理:** 通过部署多个缓存实例,形成集群,当其中一个节点失败时,其他节点可以继续提供服务。 - **工具/技术:** Redis Cluster、Memcached 集群等。 2. **方案二:使用冗余备份:** - **原理:** 对主...

    JAVAEE笔记

    - 测试结果会在JUnit视图中显示出来,包括成功、失败的测试以及测试耗时等信息。 #### 三、Java 5的新特性 ##### 静态导入 Java 5引入了静态导入,使得可以直接使用类中的静态成员而无需指定类名。 - **语法**:...

    Makefile.pdf

    - `-`前缀:`-rm file`表示如果删除失败,不要停止执行。 4. 函数与高级特性 - `$(patsubst pattern,replacement,text)`:替换文本中符合模式的子串。 - `$(filter pattern,...)`:筛选出列表中符合模式的元素。...

Global site tag (gtag.js) - Google Analytics