`
wbj0110
  • 浏览: 1586429 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ConcurrentHashMap 用法和总结

    博客分类:
  • Java
阅读更多

本次提到的应用场景是这样的,对于任务启动来说(spring quartz任务),当有一个线程正在使用时,同样的任务不要再启动一次,这样可能导致数据出错。

使用ConcurrentHashMap 来保存任务的线程信息,如果当前任务线程已经在运行中,则退出。

主要代码如下:

 

Java代码  收藏代码
  1. private static ConcurrentHashMap threadMap = new ConcurrentHashMap();  
  2.   
  3. for(final ThreadProfile profile:profiles){  
  4.             taskExecutor.execute(new Runnable(){  
  5.                 public void run(){        
  6.                     // 判断任务是否在执行,上一次任务还没有执行完,则本次退出  
  7.                     if("y".equals(threadMap.get(profile.getCode()))){  
  8.                         return;  
  9.                     }  
  10.                     threadMap.put(profile.getCode(), "y");  
  11.   }  
  12. }  

 

 

 ConcurrentHashMap  可以提供较好的并发解决方案,它的思想比hashTable 和synchronizedMap更高明一些,

使用了几个技巧来获得高程度的并发以及避免锁定,包括为不同的 hash bucket(桶)使用多个写锁和使用 JMM 的不确定性来最小化锁被保持的时间——或者根本避免获取锁。

 ConcurrentHashMap 摒弃了单一的 map 范围的锁,取而代之的是由 32 个锁组成的集合,其中每个锁负责保护 hash bucket 的一个子集。锁主要由变化性操作(put() 和 remove())使用。具有 32 个独立的锁意味着最多可以有 32 个线程可以同时修改 map。这并不一定是说在并发地对 map 进行写操作的线程数少于 32 时,另外的写操作不会被阻塞——32 对于写线程来说是理论上的并发限制数目,但是实际上可能达不到这个值。但是,32 依然比 1 要好得多,而且对于运行于目前这一代的计算机系统上的大多数应用程序来说已经足够了。

 大多并发类使用同步来保证独占式访问一个数据结构(以及保持数据结构的一致性)。ConcurrentHashMap 没有采用独占性和一致性,它使用的链表是经过精心设计的,所以其实现可以检测 到它的列表是否一致或者已经过时。如果它检测到它的列表出现不一致或者过时,或者干脆就找不到它要找的条目,它就会对适当的bucket 锁进行同步并再次搜索整个链。这样做在一般的情况下可以优化查找,所谓的一般情况是指大多数检索操作是成功的并且检索的次数多于插入和删除的次数。 
 我们看一下 get 方法实现

 

Java代码  收藏代码
  1. V get(Object key, int hash) {  
  2.            if (count != 0) { // read-volatile  
  3.                HashEntry<K,V> e = getFirst(hash);  
  4.                while (e != null) {  
  5.                    if (e.hash == hash && key.equals(e.key)) {  
  6.                        V v = e.value;  
  7.                        if (v != null)  
  8.                            return v;  
  9.                        return readValueUnderLock(e); // recheck  
  10.                    }  
  11.                    e = e.next;  
  12.                }  
  13.            }  
  14.              

 

 检索操作首先为目标 bucket 查找头指针(是在不锁定的情况下完成的,所以说可能是过时的),然后在不获取 bucket 锁的情况下遍历 bucket 链。如果它不能发现要查找的值,就会同步并试图再次查找条目。

 ConcurrentHashMap 对于很多并发应用程序来说是一个非常有用的类,而且对于理解 JMM 何以取得较高性能的微妙细节是一个很好的例子。ConcurrentHashMap 是编码的经典,需要深刻理解并发和 JMM 才能够写得出。

分享到:
评论

相关推荐

    ConcurrentHashMap之实现细节

    - **跨段操作**:尽管每个段都可以独立地进行读写操作,但某些方法(如`size()`和`containsValue()`)需要访问整个散列表。这时就需要锁定所有段以保证一致性。为了防止死锁,`ConcurrentHashMap`保证了获取锁的顺序...

    71-ConcurrentHashMap笔记1

    《并发编程:深入理解JDK...总结来说,JDK1.8的ConcurrentHashMap在设计上兼顾了线程安全和性能,通过巧妙的数据结构和算法优化,实现了高效并发的哈希映射。理解和掌握其工作原理,对于编写高效的并发程序至关重要。

    java 使用ConcurrentHashMap和计数器实现锁

    Java 使用 ConcurrentHashMap 和计数器实现锁 Java 使用 ConcurrentHashMap 和计数器实现锁是 Java 编程语言中的一种常见的锁机制实现方式。该机制主要通过使用 ConcurrentHashMap 和计数器来实现线程之间的同步和...

    24 经典并发容器,多线程面试必备。—深入解析ConcurrentHashMap.pdf

    总结,`ConcurrentHashMap`是Java并发编程中重要的并发容器,它的设计兼顾了线程安全和性能,是理解和掌握多线程编程的关键知识点之一。在面试或实际开发中,对于`ConcurrentHashMap`的原理和用法的深入理解,能够...

    第10讲 如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全1

    另一种更为高效的解决方案是使用Java并发包(java.util.concurrent)中的线程安全容器,例如ConcurrentHashMap。ConcurrentHashMap是Java中一种高性能的线程安全Map实现,它采用了分段锁(Segment)的设计,将整个数据...

    Java 多线程与并发(13-26)-JUC集合- ConcurrentHashMap详解.pdf

    总结来说,`ConcurrentHashMap`是Java并发编程中的核心组件,它的设计理念和实现方式随着时间的推移不断演进,以适应更高的并发需求和性能优化。理解和掌握其工作原理对于编写高性能并发代码至关重要。

    一文让你彻底理解JavaHashMap和ConcurrentHashMap

    而在Java 1.8中,ConcurrentHashMap进一步优化,采用了CAS(Compare and Swap)操作和Fork/Join框架,减少了锁的使用,提供了更高的并发性能。 ConcurrentHashMap的put和get方法比HashMap更为复杂,因为它们需要...

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    "Java多线程-知识点梳理和总结-超详细-面试知识点" Java多线程是Java编程语言中最基本也是最重要的概念之一。多线程编程可以提高程序的执行效率、改善用户体验和提高系统的可扩展性。但是,多线程编程也存在一些...

    map用法总结

    遍历`Map`有多种方法,但最常用的是通过`entrySet()`方法获取键值对的集合,然后使用迭代器进行遍历。 #### 使用`entrySet()` ```java for (Map.Entry, Integer&gt; entry : map.entrySet()) { String key = entry....

    java精通+开发案例 经典经典总结

    理解它们的区别和用法是至关重要的。 3. 控制结构:掌握if-else、switch、for、while等控制流语句,以及break和continue的使用,有助于编写逻辑清晰的代码。 4. 异常处理:理解try-catch-finally结构,学会如何抛出...

    史上最详细详解hashmap、concurrenthashmap

    总结来说,HashMap 和 ConcurrentHashMap 主要的区别在于线程安全性和数据结构优化。HashMap 适合单线程环境,追求高性能;而 ConcurrentHashMap 在多线程环境下,通过分段锁和无锁并发控制提供线程安全的存取,牺牲...

    高级JAVA面试——最全的总结

    - Map接口及实现类:HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap等,理解它们的区别和使用场景。 - 集合操作:迭代器、遍历、添加、删除、查找等方法的使用。 3. **JAVA IO与NIO** - 流的概念:字节流...

    Java最全知识总结思维导图

    本资源"Java最全知识总结思维导图"提供了全面的Java学习路径和关键知识点的概览,旨在帮助初学者和有经验的开发者系统地理解和掌握Java的核心概念。 1. **数据库**: Java在数据库交互方面主要依靠JDBC(Java ...

    java中高级面试题十大总结

    - HashMap和ConcurrentHashMap是常用的Map实现,它们的区别在于线程安全性和性能。 - 集合框架中的迭代器(Iterator)和foreach循环是遍历集合的主要方式。 5. **设计模式** - 设计模式是解决常见软件设计问题的...

    java简答题总结pdf文档

    Java简答题总结pdf文档是面试题的总结,涵盖了Java、数据库、框架、Redis、Linux等方面的知识点,包含题目讲解和考点提示,收录了公司常考笔试题,建议收藏。 第1题:数据库范式 数据库范式是设计表结构的规则,...

    Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了.docx

    Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了 本文将从四个方面详细讲解Java面试的重要知识点: 一、Java基础知识 1. HashMap的内部结构、内部原理和HashTable的区别 * HashMap的内部结构主要...

    java 并发学习总结

    本学习总结将深入探讨并发容器、同步容器、同步工具、死锁、异常处理、线程中断、线程池、返回结果以及同步方法等核心概念。 1. **并发容器**:Java提供了一系列的并发容器,如`ConcurrentHashMap`,它在并发环境下...

    JAVA 基础知识总结(手写)

    Java基础知识是每个Java开发者必备的技能,这里将对标题和描述中涉及的点进行详细的解释...以上就是对Java基础知识的一些总结,这些内容涵盖了集合框架、并发编程以及线程管理等多个方面,是理解和使用Java编程的基础。

    Java 相关的知识点总结

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和...以上就是Java相关的知识点总结,希望对你在学习和使用Java的过程中有所帮助。不断深入实践,理解和掌握这些知识点,将使你成为一名优秀的Java开发者。

Global site tag (gtag.js) - Google Analytics