Java多线程下集合类并发修改异常处理

ArrayList是线程不安全的,因为在他的 add 方法添加元素时,为了保证并发性,没有加锁。

public class CollectionTest {

    public static void main(String[] args) {
        final List<String> list = new ArrayList<>();
        for (int i = 0; i <20; i++) { //创建20个线程

            new Thread(new Runnable() {
                @Override
                public void run() { //list添加随机字符串
                    list.add(UUID.randomUUID().toString().substring(0,8));
                    System.out.println(list);
                }
            }).start();
        }
    }
}

- 打印结果-- - -- - - - - - - -
java.util.ConcurrentModificationException

高并发下的修改异常

解决方案一:用 Vector 代替 ArrayList ,Vector相较于ArrayList是线程安全的,Vector 所有针对集合内元素的操作方法都是由 synchronized 修饰的。但是!!Vector 是JDK1.0引入的,ArrayList是1.2引入的。为何有线程安全的还要新出一个不安全的?

                      Vector 的缺点:由于加了synchronized,导致失去了并发性,效率大大下降。

解决方案二:用 Collections.synchronizedList(new ArrayList<String>()) 代替new ArrayList<String>()。

public class CollectionTest {

    public static void main(String[] args) {
        // final List<String> list = new ArrayList<>();
        // final List<String> list = new Vector<>();
        final List<String> list = Collections.synchronizedList(new ArrayList<String>());
        for (int i = 0; i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值