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方法。

  • 相关阅读:
    删除文件夹右键下的部分目录
    c# datagridview导出到excel【转载】
    使用AO新增记录的3种方法【转载】
    AE 打包
    ArcMap 9使用技巧
    ArcEngine 渲染的使用【转载】
    关于数据库版本压缩
    SDE数据源直连
    ArcCatalog 9中的使用技巧
    AE指定字段转成注记
  • 原文地址:https://www.cnblogs.com/DreamFather/p/14577516.html
Copyright © 2011-2022 走看看