欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高并发情况下ArrayList,HashSet,HashMap线程不安全的解决办法

程序员文章站 2022-04-01 08:47:53
...

package com.atguigu.day01;

//java.util.ConcurrentModificationException

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**

  • @auther zzyy
  • @create 2020-03-28 7:51
  • 出故障了,如何面对?
  • 1 故障现象
  • java.util.ConcurrentModificationException
  • 2 导致原因
  • 3 解决方法
  • 集合ArrayList线程不安全解决方法
  • 1.1 new Vector<>();
  • 1.2 Collections.synchronizedList(new ArrayList<>());
  • 1.3 juc—new CopyOnWriteArrayList<>();
  • HashSet线程不安全解决方法
  • 2.1 Collections.synchronizedSet(new HashSet<>());
  • 2.2 juc—new CopyOnWriteArraySet<>();
  • HashMap线程不安全解决方法
  • 3.1new ConcurrentHashMap<>();
  • 4 优化建议(同样的错误不犯第2次)
  • 写时复制 ,同一个时间,有读取,也有写入。 读写分离的思想

*/

public class ArrayListDemo {

public static void main(String[] args) {
    //Map<String, String> map = new HashMap<>(); 线程不安全的
    Map<String, String> map = new ConcurrentHashMap<>();

    for (int i = 0; i <30 ; i++) {
        new Thread(() -> {
            map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));
            System.out.println(map);
        },"线程"+i).start();
    }
}





    public void SetNoSafe(){
    //        Set<String> set = new HashSet<>();    线程不安全的
    //        Set<String> set = Collections.synchronizedSet(new HashSet<>());
    Set<String> set = new CopyOnWriteArraySet<>();
    for (int i = 0; i <30 ; i++) {
        new Thread(() -> {
            set.add(UUID.randomUUID().toString().substring(0,6));
            System.out.println(Thread.currentThread().getName()+set);
        },"线程"+i).start();
    }

}






public void ListNoSafe(){
    //List<String> list = new ArrayList<>(); 线程不安全的
    //List<String> list = new Vector<>();
    //List<String> list = Collections.synchronizedList(new ArrayList<>());
    List<String> list = new CopyOnWriteArrayList<>();

    for (int i = 0; i <30 ; i++) {
        new Thread(() -> {
            list.add(UUID.randomUUID().toString().substring(0,6));
            System.out.println(Thread.currentThread().getName()+list);
        },"线程"+i).start();
    }
}

}

相关标签: mycode JUC java