JUC学习(4)集合安全的学习,以及解决

关于集合的安全问题

1.ArrayList的解决方案:

                       1. Vector

                       2. Collections.synchronizedList()

                       3. CopyOnWriteArrayList

2.hashSet的解决方案

                       1.CopyOnWriteArraySet
3.hashMap的解决方案

                       1. ConcurrentHashMap

list:

当多个线程对list集合进行一个add和查看时就会发生java.util.ConcurrentModificationException

代码:

List<Object> list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
               list.add("x");
            }).start();
        }
        System.out.println(list);



而Vector解决方案为:

List<Object> list = new Vector<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add("x");
            }).start();
        }
        System.out.println(list);

Collections.synchronizedList()的解决方案

List<Object>  objects=new ArrayList<>();
        List<Object> list = Collections.synchronizedList(objects);
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add("x");
            }).start();
        }

但前两种已经过时了,现在使用

CopyOnWriteArrayList list = new CopyOnWriteArrayList();

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add("x");
            }).start();
        }
        System.out.println(list);

      这个的原理为,当读的读写异步,在读的时候将旧的数据复制一份,用旧的数据进行读,用心的数据进行写

hashSet的解决方案:

CopyOnWriteArraySet()的原理本质上和CopyOnWriteArrayList()一样

 Set set = new CopyOnWriteArraySet();

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                set.add("x");
            }).start();
        }
        System.out.println(set);

    hashMap的线程不安全问题的解决

 Map<Object, Object> hashMap = new ConcurrentHashMap<>();

        for (int i = 0; i < 30; i++) {
            String s = String.valueOf(i);
            new Thread(() -> {
              hashMap.put(s,UUID.randomUUID().toString().substring(0,8));
              System.out.println(hashMap);
            }).start();
        }

具体解决为在putval方法中加入了synchronized代码块

而hashmap中并没有

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值