java并发初探ConcurrentHashMap

Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力。

1.8中ConcurrentHashMap的线程安全

1.volatile Node<k,v> []table保证数组的可见性
2.get操作没有加锁
3.put操作调用final V putVal(K key, V value, boolean onlyIfAbsent) ,在方法内部为Syncronized方法加锁,Syncronized据说在1.8得到优化
4.扩容的方法不是Syncronized,而在数据迁移的时候通过Syncronized迁移数据
5.多线程putVal(K key, V value, boolean onlyIfAbsent),通过helpTransfer帮助数组扩容(binCount),然后继续添加元素 (binCount!=0跳出)

            else if ((fh = f.hash) == MOVED)tab = helpTransfer(tab, f);

6.多线程下扩容,因为扩容是多线程共同进行,而且锁住了首节点,能够快速扩容

            else if ((f = tabAt(tab, i)) == null)//锁住节点advance = casTabAt(tab, i, null, fwd);else if ((fh = f.hash) == MOVED)advance = true; // already processedelse {//执行该节点的扩容数据移动synchronized (f) {

7.ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(log(N)))
synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

例子

package com.java.javabase.thread.collection;import com.java.javabase.innerclass.DoThis;
import lombok.extern.slf4j.Slf4j;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;/*** @author*/
@Slf4j
public class ConcurrentHashMapTest {public static int cap = 5;public static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();//public static HashMap<Integer, String> map = new HashMap<>();//会出现ConcurrentModificationExceptionpublic static void main(String[] args) {InnerThread t1= new InnerThread("t1");InnerThread t2= new InnerThread("t2");t1.start();t2.start();//printAll(map);}static class InnerThread extends Thread {public InnerThread(String name){super(name);}@Overridepublic void run() {for (int i = 0; i < cap; i++) {try {map.put(i, String.valueOf(i));Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}printAll(map);}}}static void printAll(Map<Integer, String> map) {//Set<Map.Entry<Integer, String>> entrySet=map.entrySet();Set entrySet = map.entrySet();Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();while (it.hasNext()) {Map.Entry entry = it.next();log.info("thread {}: ,key {} value {}", Thread.currentThread().getName(),entry.getKey(), entry.getValue());}}
}

转载于:https://www.cnblogs.com/JuncaiF/p/11396255.html

java并发初探ConcurrentHashMap相关推荐

  1. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

  2. Java 并发实践 — ConcurrentHashMap 与 CAS

    转载自 Java 并发实践 - ConcurrentHashMap 与 CAS 最近在做接口限流时涉及到了一个有意思问题,牵扯出了关于concurrentHashMap的一些用法,以及CAS的一些概念 ...

  3. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  4. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  5. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  6. java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...

  7. 【Java并发】-- ConcurrentHashMap如何实现高效地线程安全(jdk1.8)

    文章目录 1.传统集合框架并发编程中Map存在的问题? 2.早期改进策略 3.ConcurrentHashMap采取了哪些方法来提高并发表现(jdk1.8)? 4.ConcurrentHashMap实 ...

  8. Java并发编程-ConcurrentHashMap

    目录 1. JDK 7 HashMap 并发死链 1.1.HashMap回顾 1.2.测试代码 1.3.死链复现 1.4.源码复现 1.5.小结 2. JDK 8 ConcurrentHashMap ...

  9. JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析

    HashMap是一个线程不安全的类,在并发情况下会产生很多问题,详情可以参考HashMap 源码解析:HashTable是线程安全的类,但是它使用的是synchronized来保证线程安全,线程竞争激 ...

最新文章

  1. 关于学习Python的一点学习总结(51)
  2. springboot 访问httpclient接口
  3. java课程设计日历记事本代码,已开源
  4. 30岁自学python找工作-程序员自学Python开发,20到30岁几乎决定了你的未来!
  5. leetcode中求subset、全排列等问题的回溯算法总结
  6. c语言字符串去重简单,C语言实现简单飞机大战
  7. 常用的绘图约定——提高绘图和读图的效率
  8. 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
  9. NGINX介绍及参数
  10. 用matlab的毕业设计,毕业设计课题: 用 MATLAB.ppt
  11. Adobe Illustrator 中的路径查找器
  12. 2021裁判文书网抓取
  13. FMI飞马网 | 了解人工智能,30份书单不容错过(附电子版PDF下载)
  14. Forbidden什么意思
  15. 使用NS_REFINED_FOR_SWIFT使Objective-C API适应Swift
  16. python:兔子繁殖问题
  17. 4K60帧!RayLink远程控制软件如何帮助设计师远程办公?
  18. Windows系统介绍
  19. 数据与模型混合驱动的区域综合能源系统双层优化调度决策方法——阅读理解
  20. 现在自学Java可以找到工作吗?

热门文章

  1. java线程的状态有几种_Java线程的几种可用状态
  2. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?
  3. pytorch 中的数据类型,tensor的创建
  4. C++11 function用法 可调用对象模板类
  5. WIN7与WIN10 安装
  6. Java中static final用法小结
  7. Lisp的本质(The Nature of Lisp)
  8. 红外技术如何应用在 3D 电视
  9. JavaScript实现 页面滚动图片加载
  10. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)