Java实习生(二) HashMap线程不安全?你没事吧?

74 阅读3分钟

面试官:我问你一个先你一个基础的问题,HashMap用过吗?线程安全吗?

实习生:用过,业务方法有很多地方都是使用HashMap进行数据的处理和分类。HashMap线程安全不安全,要看你的具体使用场景。

面试官:(我轻蔑地看着他)HashMap不是默认线程是不安全的吗?怎么这种实际问题都不会呢?

实习生:那你的给我一个场景,我才能判断使用HashMap线程安不安全。

面试官:在一个方法内创建一个HashMap,然后把这个HashMap返回出去,是否线程安全?

实习生:这个主要分三种情况讨论。
1. 在方法内部创建HashMap,并且没有作为返回值,那么这个HashMap在多线程环境是线程安全的,因为其他线程根本不知另一个线程创建的HashMap地址,无法访问。
2. 在方法内部创建HashMap,并且作为返回值,但是在其他方法里面只是对这个HashMap进行访问(不论多线程还是单线程下),而不涉及修改(插入删除)操作,那么这个HashMap也是此时在多线程环境下也是安全的。
3. 在方法内部创建HashMap,并且作为返回值,但是在其他方法里面只是对这个HashMap进行修改(新增更新删除)操作,那么这个时候HashMap才是线程不安全。

面试官:那么为什么网上的很多文章都直接说HashMap是线程不安全的?

实习生:其实吧网上有一些都是没有真正理解HashMap线程不安全的根本原因,直接照搬别人的文章或者见解,然后大多数人这么认为之后,我们达成了一个默契的认识说HashMap是线程不安全,其实完整的说法应该是 在多线程环境下多HashMap进行修改(新增更新删除)操作是不安全的。

面试官:你的业务代码是不是基本都是使用HashMap?在高并发情况下不会有问题吗?高并发也是多线程环境吧。

实习生:大多数业务代码都是在方法内部创建HashMap并使用,基本上只涉及我刚刚上面说的第一点和第二点,很少情况才涉及到第三点,如果真的涉及到第三点,建议使用线程安全的 ConcurrentHashMap.
所谓的高并发是指 系统需要处理大量的用户请求,这就要求服务器能够高效地处理并响应这些请求。
你所说的高并发下使用HashMap是否会有线程安全问题,其实对应到服务器上是应用程序所能承受在最大业务线程,既然是业务线程,也就是单线程执行,不存在所谓的多线程环境,高并发情况,按照我上面所说的,不涉及第三点,那么HashMap也不会有线程安全问题。