同步容器类——ConcurrentHashMap(锁分段机制)

我们知道,Hashtable 是线程安全的。但是,使用的锁方式是:锁住整张Hash表,效率低。
ConcurrentHashMap用的是内部“锁分段”的机制,代替Hashtable 的独占锁,进而提升了效率。JDK 1.8 之后,也把这样的锁分段机制,改成了CAS算法了。
CopyOnWriteArrayList / CopyOnWriteArraySet : “写入并复制”
注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。
代码:
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");
}
}
}
在这个测试代码中,使用了线程安全的 Collections.synchronizedList(new ArrayList<String>());
但是,迭代的时候,会出现 并发修改异常。
java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.atguigu.juc.HelloThread.run(TestCopyOnWriteArrayList.java:43) at java.lang.Thread.run(Unknown Source)
换成 CopyOnWriteArrayList:
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 CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
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");
}
}
}
可以解决这个并发修改问题,因为,
CopyOnWriteArrayList 在每次写入数据时,都会复制一个全新的list,因此,线程安全。但是,这个过程,也导致效率低下。
当并发迭代操作多的时候,可以使用。

浙公网安备 33010602011771号