接触过HashMap的人应该对线程安全问题都不陌生,就算是没踩过多线程下HashMap的坑,起码在学习的过程中应该也听说过是非线程安全的,几乎你问每一个程序员hashmap是不是线程安全的,大家都会告诉不是的,那么我来从个人层面探讨一下看似人人都懂的线程安全问题。
首先,hashmap线程安全吗?答案显然是否定的,在java中如果你想要在多线程中安全的使用map的话,目前我所知道的有四种:
1.juc包下的ConcurrentHashMap,提到ConcurrentHashMap这里又是涉及了许多思想,线程安全,数据结构等问题的一个map类,后面有机会的话会好好写文章分析一下这个并发安全的map类。我相信如果有多线程编程经验的同学应该也大多数是采用了ConcurrentHashMap。
2.调用Collections 工具包下的Collections.synchronizedMap()方法可以返回一个线程安全的map,点进源码可以方法,这个方法实现线程安全的方法其实是在类内部维护了一个Object mutex,在所有对map的操作方法里都加入了对mutex这个对象的同步处理进而保证线程安全。
3.使用hashtable。非常不推荐使用hashtable,原因很简单,看看源码你就会发现,这个类的实现非常简单粗暴,就是把所有方法都加入了synchronized关键字保证线程安全的,在多线程下效率会受到较大影响。
4.当然了,我们也可以不依靠java内置的类,通过自己开发map类