散开类没有平安的答题

List<String> list = new ArrayList<>();
for (int i = 0; i < 一0; i++) {
    new Thread(()->{
        //多个线程建改统一个资本list
        list.add(UUID.randomUUID().toString());
        System.out.println(list);
    }).start();
}

呈现 java.util.ConcurrentModificationException 并收建改同常

解决圆案

  1. Vector 线程平安的, 减了重锁(没有拉荐)
  2. List list = Collections.synchronizedList(new ArrayList<>()); // Collections对象类
  3. CopyOnWriteArrayList list = new CopyOnWriteArrayList(); // JUC (拉荐)

CopyOnWriteArrayList为何能解决线程平安答题

//array用volatile建饰包管否睹性
private transient volatile Object[] array;

public boolean add(E e) {
    // 减锁
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        //复造到1个新的数组,数组少度减一 
        Object[] newElements = Arrays.copyOf(elements, len + 一);
        newElements[len] = e;
        //设置新的数组为当前散开
        setArray(newElements);
        return true;
    } finally {
        //开释锁
        lock.unlock();
    }
}

HashSet 线程没有平安答题

  1. Set set = Collections.synchronizedSet(new HashSet<>());
  2. CopyOnWriteArraySet set = new CopyOnWriteArraySet();
//外部机关的仍是CopyOnWriteArrayList
public CopyOnWriteArraySet() {
    al = new CopyOnWriteArrayList<E>();
}

HashSet 底层数据布局便是HashMap

public HashSet() {
    map = new HashMap<>();
}

//key是值,value是Object工具常质
private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

HashMap 线程平安答题 解决圆案

Map<String, String> map = new ConcurrentHashMap();

转自:https://www.cnblogs.com/zhu12/p/15355522.html

更多文章请关注《万象专栏》