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

posted @ 2021-03-25 14:59  Dream's  阅读(532)  评论(0编辑  收藏  举报