ConcurrentModificationException异常分析与解决

ConcurrentModificationException异常分析与解决

1、场景重现,制造ConcurrentModificationException异常

	@Test
	public void ConcurrentModificationExceptionTest() {
		JSONArray jsonArray = new JSONArray();
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", 800);
		jsonObject.put("msg", "msg");
		jsonArray.add(jsonObject);

		for (Object item : jsonArray) {
			JSONObject json = JSON.parseObject(JSON.toJSONString(item));
			if (Objects.equals(json.getInteger("code"), 800) &&
					Objects.equals(json.getString("msg"), "msg")) {
				jsonArray.remove(item);
			}
		}

		log.info("jsonArray: {}", jsonArray);
	}

在这里插入图片描述

2、哪些情况下会产生ConcurrentModificationException异常

  • 通常在遍历集合的同时对其进行修改时抛出
  • 如果在使用迭代器遍历集合时,集合结构发生了变化(例如添加或删除元素)
  • 多个线程同时对同一个集合进行修改

3、如果避免ConcurrentModificationException异常

  • 如果多个线程同时访问同一个集合,可以使用线程安全的集合类,如ConcurrentHashMap或CopyOnWriteArrayList
  • 在使用迭代器遍历集合时,可以使用迭代器自身的remove方法来安全地删除元素,而不是使用集合类的remove方法
  • 使用removeIf()方法来删除满足条件的元素

3.1、使用CopyOnWriteArrayList

	@Test
	public void ConcurrentModificationExceptionTest() {
		JSONArray jsonArray = new JSONArray();
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", 800);
		jsonObject.put("msg", "msg");
		jsonArray.add(jsonObject);

		CopyOnWriteArrayList<Object> writeArrayList = new CopyOnWriteArrayList<>(jsonArray);

		for (Object item : writeArrayList) {
			JSONObject json = JSON.parseObject(JSON.toJSONString(item));
			if (Objects.equals(json.getInteger("code"), 800) &&
					Objects.equals(json.getString("msg"), "msg")) {
				writeArrayList.remove(item);
			}
		}

		log.info("writeArrayList: {}", writeArrayList);
	}

3.2、基于下标遍历

	@Test
	void ConcurrentModificationExceptionTest() {
		JSONArray jsonArray = new JSONArray();
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", 800);
		jsonObject.put("msg", "msg");
		jsonArray.add(jsonObject);

		for (int i = 0; i < jsonArray.size(); i++) {
			Object item = jsonArray.get(i);
			JSONObject json = JSON.parseObject(JSON.toJSONString(item));
			if (Objects.equals(json.getInteger("code"), 800) &&
					Objects.equals(json.getString("msg"), "msg")) {
				jsonArray.remove(i);
			}
		}

		log.info("jsonArray: {}", jsonArray);
	}

3.3 removeIf方法

	@Test
	void removeIfTest() {
		JSONArray jsonArray = new JSONArray();
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", 800);
		jsonObject.put("msg", "msg");
		jsonArray.add(jsonObject);

		jsonArray.removeIf(object -> {
			JSONObject json = JSON.parseObject(JSON.toJSONString(object));
			return Objects.equals(json.getInteger("code"), 800);
		});

		log.info("jsonArray: {}", jsonArray);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值