Java基础--关于集合的异常,ConcurrentModificationException

本篇是关于Java基础的内容,老鸟可以直接略过。新手的话,可以看看,当一个知识点查漏补缺。

1.关于多线程操作同一个List的代码

package com.cjt.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author caojiangtao
 * @date 2020-07-20 10:34
 */
public class TestFailFast {
	
	/**
	 * java.util包中的所有集合类,包括List<E>,Set<E>,Map<K,V>都是被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。
	 *	
	 *	 概念:fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
	 * 
	 * 	 集合的并发修改异常 --<ConcurrentModificationException>
	 *   fail—fast迭代器抛出ConcurrentModificationException
	 *   fail—safe迭代器从不抛出ConcurrentModificationException
	 * 
	 * **/

	/** 多线程操作ArrayList的时候,会报错 java.util.ConcurrentModificationException **/
//	public static List<String> list = new ArrayList<>();
	
	/** 多线程操作的时候使用CopyOnWriteArrayList是安全的,不会报错 **/
	public static List<String> list = new CopyOnWriteArrayList<>();
	

	public static void main(String[] args) {
		new ThreadOne().start();
		new ThreadTwo().start();
	}
	
	private static void printAll(String flag) {
		String val = null;
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			val = it.next();
			System.out.println("flag = "+flag+", val == "+val);
		}
		
	}
	
	public static class ThreadOne extends Thread {
		@Override
		public void run() {
			for(int i = 0 ; i < 6 ; i++) {
				list.add("线程1测试 ************************ "+i);
				printAll("** thread-1 ** "+i);
			}
		}
	}
	
	public static class ThreadTwo extends Thread {
		@Override
		public void run() {
			for(int i = 0 ; i < 6 ; i++) {
				list.add("线程2测试 ================= "+i);
				printAll("## thread-2 ## "+i);
			}
		}
	}

}

这段代码中List初始化的时候有两种方式,

  • List<String> list = new ArrayList<>();
  • List<String> list = new CopyOnWriteArrayList<>();

如果使用第一种ArrayList<> 的话,一定会抛出异常ConcurrentModifificationException,使用CopyOnWriteArrayList<>就一定不会抛出该异常。这个异常翻译过来就是“并发修改异常”,也就是说List的子类ArrayList不支持并发修改。

 

2.关于并发修改异常fail-fast和fail-safe

  • java.util 包下的集合,在实现的时候,如果有多个线程同时操作同一个集合的并发操作,会快速的失败,也就是我们常说的fail-fast,然后接着抛出ConcurrentModifificationException。
  • java.util.concurrent 包下的集合,在实现的时候,允许多线程操作同一个集合,而且不会抛出ConcurrentModifificationException,也就是我们常说的 fail-safeConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet等这类就属于fail-safe,不会抛出ConcurrentModifificationException

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛声依旧Cjt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值