Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。
锁分段
机制代替Hashtable 的独占锁
。进而提高性能。读
数和遍历远远大于
列表的更新
数时,CopyOnWriteArrayList 优与同步的 ArrayList。内部使用独占锁
机制,特别是遇到大量的复合操作
时效率就会很低。
锁分段
机制:concurrentLevel分段级别,默认16段(segment)
这里每个分段都是一个独立的锁,这就意味着多个线程并发访问时并行执行,效率瞬间就高了。并且该类内部也提供了一些复合操作的方法。
在JDK1.8之后,jvm底层将ConcurrentHashMap底层的分段锁
转换为了 CAS(不会阻塞,不涉及上下文交互) 机制
在此之前我们模拟并发修改异常情况:在遍历集合时为集合添加元素
package com.pyy.juc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class TestCopyOnWriteArrayList {
public static void main(String[] args) {
HelloThread ht = new HelloThread();
for(int i = 0; i < 10; i++) {
new Thread(ht).start();
}
}
}
class HelloThread implements Runnable {
private static List<String> list = Collections.synchronizedList(new ArrayList<String>());
static {
list.add("AA");
list.add("BB");
list.add("CC");
}
@Override
public void run() {
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
list.add("AA");
}
}
}
结果:报并发修改异常java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.pyy.juc.HelloThread.run(TestCopyOnWriteArrayList.java:35)
at java.lang.Thread.run(Thread.java:745)
如果遇到这样的操作我们可以使用 CopyOnWriteArrayList 并发容器类解决这问题:这个类的底层会在你执行写入之前先复制出一个新的列表再执行写入。 注意: