HashMap的线程安全类

184 阅读1分钟

HashMap底层并没有什么保证线程安全的手段,那么当多个线程操作同一个map时就会出现线程安全的问题,一般我们会找一些HashMap的线程安全类来使用,这里我们就来看一下HashMap的一些线程安全类。

HashTable

HashTable底层的实现和HashMap类似,但是HashTable底层通过给方法加synchronized关键字,从而保证了线程安全。由于锁是加在方法上的,锁的是对象,锁的粒度相对较大,并发度较低,一般不建议使用。

Collections.synchronizedMap()

此方法会根据你传入的HashMap对象,返回一个线程安全的HashMap对象。 image.png 可以看到此方法底层持有一个mutex锁,底层的方法在执行时会先使用synchronized关键字给代码块加锁,从而保证线程安全。

ConcurrentHashMap

ConcurrentHashMap是JUC下的一个并发工具类,底层使用cas原子方法对节点进行新增和修改等操作,同时在put操作时使用synchronized关键字保证线程的并发安全,由于jdk1.6引入了偏向锁和轻量锁,性能相较于上面这两个更好,一般来说ConcurrentHashMap是最优的选择。后续会详细说一下ConcurrentHashMap。