zoukankan      html  css  js  c++  java
  • HashMap如何实现线程安全

    1.使用HashTable

    Map<String,Object> hashtable=new HashTable<>();

    HashTable底层是数组和链表的形式,方法都是用synchronized修饰的,因此是线程安全的,但执行效率比较低。

    2.使用java.util.concurrent.concurrentHashMap

    Map<String,Object> concurrentHashMap=new ConcurrentHashMap<>();

    concurrentHashMap结构图:

    concurrentHashMap包含多个segment(最多16个),segment类似HashTable,是线程安全的,因此concurrentHashMap是一个segment数组,当有线程操作时,一个线程会操作一个segment,因此多线程也是安全的,有几个segment就允许几个线程同时操作。一般操作最先都是将key映射到对应的segment上。不需要锁这个类,分段锁。

    使用锁分段技术,将数据分段存储,给每一段数据配一把锁,效率高。

    java7中使用segment实现,对每个Segment加锁。

    java8中直接在HashMap基础上进行加锁。

    Segment:段

    3.使用java.util.collections.synchronizedMap()方法包装HashMap,得到线程安全的Map

    Map<String,Object> synchronizedHashMap=Collections.synchronizedMap(new HashMap<String,Object>());

    synchrozizedMap的线程安全和HashTable一样,使用synchronized方法。

  • 相关阅读:
    Zepto跨域请求
    C语言中浮点数的比较
    IOS开源项目Telegram初试
    Java NIO初试
    ios8.0之后注册通知中心
    spring AOP的配置
    IOS学习日记-2014年10月25日
    struct框架中实体类中属性的类型错误问题
    Oracle存储过程使用DML语句问题
    跳出类似framset 嵌入式框架
  • 原文地址:https://www.cnblogs.com/DreamFather/p/14577516.html
Copyright © 2011-2022 走看看