利用Collections将非线程安全的Map转换成线程安全的Map
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来进行,从而就不会存在线程冲突导致程序执行结果有误的情况。
利用Collections将非线程安全的Map转换成线程安全的Map相关推荐
- java 把map转换成json_map转换成JSON的3种方法
1 json-lib net.sf.json-lib json-lib 2.4 jdk15 import java.util.HashMap; import java.util.Map; import ...
- MapStruct Map 转换成对象
背景 调用公司影像识别服务接口,返回值都是 Map<String,Object>类型,有的key很多.想把这种 map 结果转为项目中对应的JavaBean如DTO 或者 VO,又不想写很 ...
- java中把map转换成list
private String key; private String value; //把map转换成list的公共方法 public static List map ...
- java非负整数怎么设_使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法...
使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法 使用JAVA将非负十进制整数n转换成b进制,递归方法与非递归方法 一.题目要求 将非负十进制整数n转换成b进制.(其中b=2~16) ...
- 将map转换成json字符串
import java.util.HashMap;import java.util.Map;import net.sf.json.JSONObject;public class Transfer {p ...
- 自动将Map转换成对象的方法
实现自动将Map转换成对象,借助第三方工具commons-beanutils-1.8.0.jar+commons-logging.jar实现,需要遵守的规则创建的对象的属性名必须与map的key相同. ...
- 利用栈的基本操作,将一个十进制数转换成8进制数
题目 利用栈的基本操作,将一个十进制数转换成8进制数 #include<iostream>using namespace std;#define MAXSIZE 100 typedef i ...
- raw服务器镜像文件怎么打开,利用qemu-img工具将其它格式镜像文件转换成VHD或RAW格式的方法...
利用qemu-img工具将其它格式镜像文件转换成VHD或RAW格式的方法 发布时间:2020-08-26 14:31:49 来源:亿速云 阅读:962 作者:小新 小编给大家分享一下利用qemu-im ...
- Java中,通过synchronizedXxx()将线程不安全的集合转换成线程安全的集合
保证线程安全的方法 synchronizedXxx():该方法可以使指定的集合包装成线程安全的集合,并返回 例如: Collections.synchronizedList(List) 将线程不安全的 ...
最新文章
- 让对方ping不通你的主机
- :new与:old的用法
- iptables基本配置方法
- c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...
- c语言dll创建线程,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
- CentOS7.4到Elasticsearch一路坑(八)(坑没填上)
- Linux系统管理第六周作业【Linux微职位】
- 【转】ASP.net2。0中解决无法获取 GridView 隐藏列值问题
- 新浪财经三人行:专家谈萨班斯法案聊天实录
- windows 无法安装到这个磁盘,选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装在GPT磁盘上
- android删除字符,【已解决】Android中EditText中退格键BackSpace键(删除键)不起效果:无法删除字符...
- [MATLAB 在科学计算中的应用] 使用MATLAB 进行非线性拟合
- Ubuntu 15.10 x64 安装 Android SDK
- 叫车难再现,滴滴回应“不加价叫车难”问题
- Excel里面输入18位数字,但是显示却是其他的?!请问怎么解决?
- 深刻理解Linux进程间通信(IPC)
- 2.2 数据管理 之 数据加权
- NRF24L01P(nrf24l01+)从入门到使用
- 越多的人入局棋牌游戏开发行业,游戏产品突出竞技元素
- IBM ServerGuide 8.41