JDK5.0以后提供了多种并发类容器来替代同步容器从而改善性能。
同步类容器的状态都是串行化。
他们虽然实现了线程安全,但是严重降低了并发性,在多线程的环境时,严重的降低了应用程序的吞吐量。
ConcurrentMap
接口:
ConcurrentHashMap
ConcurrentShipListMap (支持并发排序功能)
1.ConcurrentHashMap 内部使用段(Sement)来表示这些不同的部分,每个段其实就是一个的HashTable,他们有自己的锁。
2.只要多个修改操作发生在不同的段上,他们就可以并发的进行。把一个整体分成16个段(Segement)也就是最高支持16个线程的并发修改操作。
3.这也是在多线程场景时减少锁的粒度从而降低锁竞争的一种方案。并且代码中大多共享变量使用的volatile关键字申明,目的是第一时间获取修改的内容,性能非常好。
代码
public static void main(String[] args) { ConcurrentHashMap<String, Object> hashMap = new ConcurrentHashMap<String,Object>(); hashMap.put("key1", "aaaa"); hashMap.put("key2","bbbbbbbb"); hashMap.put("key1", "ccc"); hashMap.putIfAbsent("key2", "ddd"); hashMap.putIfAbsent("key4", "sssssss"); /** * put key值存在就替换不存在就新增 * putIfAbsent 存在不操作 不存在 新增 */ for(Map.Entry<String,Object> me: hashMap.entrySet()){ System.err.println(me.getKey()+"++++++++++value*********"+me.getValue()); } int len = hashMap.size(); System.err.println(len); }
结果
小结:1.ConcurrentHashMap 分段,独立,互不影响
2. put key存在替换 不存在新增
3.putIfAbsent key存在不替换 不存在新增
private static final int DEFAULT_CAPACITY = 16; 默认分为16段
基础课外了解知识点:
1. CPU Cache 与缓存行