`

hashset并发产生的java.util.ConcurrentModificationException解决办法

阅读更多
package com.yonge.concurrent;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

/**
 * 需求:解决hashset并发产生的java.util.ConcurrentModificationException异常
 * @author wb-gaoy
 * @version $Id: HashSetTest.java,v 0.1 2012-1-11 下午5:14:53 wb-gaoy Exp $
 */
public class HashSetTest {

    public static void main(String[] args) {

        final Set<Integer> set = Collections.synchronizedSet(new HashSet<Integer>());
        //开启A线程向set中放数据
        new Thread(new Runnable() {

            @Override
            public void run() {
                int i;
                while (true) {
                    try {
                        i = new Random().nextInt(1000);
                        System.out.println("准备加入到Set...");
                        set.add(i);
                        System.out.println("加入到Set:" + i);
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }
                }
                System.exit(0);
            }
        }, "A").start();

        //开启B线程删除set中的数据
        new Thread(new Runnable() {

            @Override
            public void run() {
                Iterator<Integer> iter = null;
                while (true) {
                    synchronized (set) {
                        try {
                            iter = set.iterator();
                            System.out.println("开始迭代..");
                            int i;
                            while (iter.hasNext()) {
                                System.out.println("准备删除Set....");
                                i = iter.next();
                                iter.remove();
                                System.out.println("删除Set:" + i);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            break;
                        }
                    }
                }
                System.exit(0);
            }
        }, "B").start();
    }
}

 

1
3
分享到:
评论
1 楼 unsure520 2012-01-13  
        不小心踩了一脚

相关推荐

    多线程中使用Java集合类.doc

    4. 如果需要更复杂的并发控制,可以使用`java.util.concurrent.locks`包下的Lock接口及其实现,如ReentrantLock,配合`tryLock()`方法进行细粒度的锁控制。 总的来说,处理多线程环境中的Java集合类时,开发者需要...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    此问题的核心在于,Java的集合类(如ArrayList、LinkedList、HashSet等)并不支持并发修改。当你在一个迭代器正在遍历集合的过程中添加或删除元素时,就会抛出这个异常。这个问题在单线程环境下不会出现,但在多线程...

    Java程序员们最常犯的10个错误.docx

    然而,这返回的是一个内部类`java.util.Arrays.ArrayList`,它不支持添加元素。如果需要可变的`ArrayList`,应该使用构造函数来创建新的`ArrayList`,如: ```java ArrayList&lt;String&gt; arrayList = new ArrayList...

    java基础 集合-22-迭代器设计模式

    为了解决这个问题,Java提供了`ConcurrentSkipListMap`和`CopyOnWriteArrayList`等线程安全的集合,它们的迭代器允许并发修改。 7. **增强型for循环(foreach)** Java 5引入了增强型for循环,也称为foreach循环,...

    阿里巴巴java开发手册1.40版

    - 对共享资源进行原子操作,使用`synchronized`关键字或`java.util.concurrent`包下的工具类。 7. **设计模式**: - 推崇SOLID原则,即单一职责、开闭原则、里氏替换、接口隔离和依赖倒置。 - 使用工厂模式、...

    Iterator详解

    Java的迭代器接口位于`java.util`包中,它提供了遍历集合元素的基本方法。迭代器的主要方法包括`iterator()`、`hasNext()`、`next()`和`remove()`。 2. **iterator()方法**: `iterator()`方法是`Iterable`接口的...

    java 使用foreach遍历集合元素的实例

    5. **异常解释**:`ConcurrentModificationException`通常在多线程环境下对共享集合进行并发修改时抛出,但在单线程环境中,当使用`foreach`循环并尝试在循环内部修改集合时,也会抛出此异常。这是因为`foreach`循环...

    迭代器测试

    在Java编程语言中,迭代器(Iterator)是一个非常重要的概念,它是访问集合元素的主要方式,特别是在遍历集合如ArrayList、LinkedList、HashSet等时。迭代器允许程序员按照某种顺序访问集合中的元素,而无需暴露集合...

    Iterator:设计模式

    此外,`ConcurrentModificationException`是Java集合框架中常见的异常,当并发修改集合和迭代器时,系统会抛出此异常。 总的来说,迭代器设计模式是Java编程中不可或缺的一部分,它使得遍历和操作集合变得更加灵活...

Global site tag (gtag.js) - Google Analytics