java.util.ConcurrentModificationException 并发修改异常Vector、封装一层Synchronized、(JU包下的)Collections.synchronizedList(new ArrayList<>())来代替,当然这些方案效率是不如JUC下的CopyOnWriteArrayList这个是用来替换ArrayList的
使用方法如下:
new CopyOnWriteArrayList<>(new ArrayList<>());
或者new CopyOnWriteArrayList<>();
add需要加锁

get是直接从数组中读取

防止指令重排,配合锁机制可以实现读写冲突时的最终一致性

Collections.synchronizedSet(new HashSet<>());由源码可知,其底层仍然使用的是CopyOnWriteArrayList,难怪这个Set叫ArraySet。。

添加时需要先判断是否存在,这里时间复杂度明显高于HashSet的O(1)

HashMap的并发解决方案,二者都继承于AbstractMap且ConcurrentMap也继承于Map,即证明二者大题相同,但既然是保证了并发,应该从添加元素的逻辑找出区别


await()阻塞直到计数器归零countDown()数量-1
await()方法,与ConditionObject差不多,调用的都是AQS中的方法
这个和上面的不一样,这个是:
CountDownLatch是阻塞直到计数器归零,CyclicBarrier是累加到某一个值的时候触发CyclicBarrier可以在第二个参数添加一个Runnable

可以做一个限流策略,由两个参数:阈值 和 是否公平

