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