利用Collections将非线程安全的Map转换成线程安全的Map

来源:互联网 发布:佛山各区签约大数据 编辑:程序博客网 时间:2024/05/16 18:51

HashMap是最常用的一种Map,属于非线程安全的Map实现类。好处是效率高,因为不用考虑线程安全,任何时候都是无脑的直接操作。

在web项目中的单线程代码中,使用HashMap是没有问题的,但是一旦涉及到同时会有多个线程访问同一个HashMap时,则会导致程序结果产生偏差。

我去看了jdk中的HashMap类的源码和注释,总结了一下这种情况如下:
   如果有多个线程同时访问同一个HashMap实例,其中只要有一个线程结构性修改了该HashMap实例,
该HashMap实例就必须通过外部手段保证其线程安全(结构性修改是指任何对该HashMap实例进
行的增加或者删除操作。如果只是改变HashMap实例中已存在的key-value元素中的value不算
结构性操作)。适合的外部手段通常是通过一个线程安全的对象来实现,而且要求这个对象的成员变量
中包含了Map。
   如果不存在符合该条件的对象的话,那么HashMap应该用Collections类的synchronizedMap方法
包装一下。最合适的做法是在Map被创建的时候用马上用synchronizedMap方法来包装一下,从而有效避免
任何非线程安全的意外操作发生,做法如下:
Map<String,String> unSafeMap = new HashMap<String,String>();
   Map safeMap = Collections.synchronizedMap(unSafeMap);
然后任何操作都通过实例对象safeMap来进行,从而就不会存在线程冲突导致程序执行结果有误的情况。


原创粉丝点击