欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HashMap如何实现线程安全

程序员文章站 2022-06-08 23:26:47
...

1.使用HashTable

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

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

2.使用java.util.concurrent.concurrentHashMap

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

concurrentHashMap结构图:

HashMap如何实现线程安全
            
    
    博客分类: java

 

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

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

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

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

Segment:段

HashMap如何实现线程安全
            
    
    博客分类: java

 

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

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

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