一、JUC 常用类
Java 5.0 在 java.utilconcurrent 包中提供了多种并发容器类来改进同步容器的性能.
1、ConcurrentHashMap
- ConcurrentHashMap 采用锁分段机制,并没有将整个hash表锁住,jdk8之后没有使用分段锁(给每个位置创建一个锁标志对象)。
- 采用CAS思想 + synchronized来实现
- 插入元素时,检测hash表对应位置是否是第一个节点,如果采用CAS机制(循环检查)向第一个位置插入数据。如果此位置已经有值,那么就以第一个Node对象为锁标志进行加锁,使用的是synchronized实现。
package com.ffyc.database.juc;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class HashMapDemo {
/*
HashMap 是线程不安全的,不能并发操作的、
ConcurrentModificationException 并发修改异常 ,遍历集合,并删除集合中的数据
HashTable 是线程安全的, public synchronized V put(K key, V value)
锁直接加到了put 方法上,相当于把整个hash表锁住了,效率比较低,
用在低并发情况
Map<String,Integer> map1= Collections.synchronizedMap(new HashMap<>());
ConcurrentHashMap
*/
public static void main(String[] args) {
// Hashtable<String,Integer> map=new Hashtable<>();
ConcurrentHashMap<String,Integer> map=new ConcurrentHashMap<>();
//模拟多个线程对其操作
for (int i = 0; i < 20; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),new Random().nextInt());
System.out.println(map);
}).start();
}
}
}
2、CopyOnWriteArrayList
- ArraayList 是线程不安全的,在高并发情况下可能会出现问题, Vector 是线程安全的.
- CopyOnWriteArrayList 将读取的性能发挥到极致,取是完全不用加锁的,写入也不会阻塞读取操作,只有写入和写入之间需要进行同步等待,读操作的性能得到大幅度提升。
package com.ffyc.database.juc;
import java.util.ArrayList;
import java.util.Random;