Java之通过Collections.synchronizedMap创建线程安全的HashMap

1 问题

我们知道hashMap线程是不安全的,一般而言,我们怎么创建线程安全的HashMap呢?

 

 

 

 

 

2 解决办法

我们可以使用Collections.synchronizedMap来创建HashMap,如下

static Map<String, String> results = Collections.synchronizedMap(new HashMap<String, String>());

 

 

 

 

 

 

3 Collections.synchronizedMap源码部分实现

我们先看synchronizedMap如果创建

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {return new SynchronizedMap<K,V>(m);
}

我们看下具体的SynchronizedMap类的部分

private static class SynchronizedMap<K,V>implements Map<K,V>, Serializable {// use serialVersionUID from JDK 1.2.2 for interoperabilityprivate static final long serialVersionUID = 1978198479659022715L;private final Map<K,V> m;     // Backing Mapfinal Object      mutex;    // Object on which to synchronizeSynchronizedMap(Map<K,V> m) {if (m==null)throw new NullPointerException();this.m = m;mutex = this;}SynchronizedMap(Map<K,V> m, Object mutex) {this.m = m;this.mutex = mutex;}public int size() {synchronized(mutex) {return m.size();}}public boolean isEmpty(){synchronized(mutex) {return m.isEmpty();}}public boolean containsKey(Object key) {synchronized(mutex) {return m.containsKey(key);}}public boolean containsValue(Object value){synchronized(mutex) {return m.containsValue(value);}}public V get(Object key) {synchronized(mutex) {return m.get(key);}}public V put(K key, V value) {synchronized(mutex) {return m.put(key, value);}}public V remove(Object key) {synchronized(mutex) {return m.remove(key);}}public void putAll(Map<? extends K, ? extends V> map) {synchronized(mutex) {m.putAll(map);}}public void clear() {synchronized(mutex) {m.clear();}}private transient Set<K> keySet = null;private transient Set<Map.Entry<K,V>> entrySet = null;private transient Collection<V> values = null;public Set<K> keySet() {synchronized(mutex) {if (keySet==null)keySet = new SynchronizedSet<K>(m.keySet(), mutex);return keySet;}}public Set<Map.Entry<K,V>> entrySet() {synchronized(mutex) {if (entrySet==null)entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);return entrySet;}}public Collection<V> values() {synchronized(mutex) {if (values==null)values = new SynchronizedCollection<V>(m.values(), mutex);return values;}}public boolean equals(Object o) {if (this == o)return true;synchronized(mutex) {return m.equals(o);}}public int hashCode() {synchronized(mutex) {return m.hashCode();}}public String toString() {synchronized(mutex) {return m.toString();}}private void writeObject(ObjectOutputStream s) throws IOException {synchronized(mutex) {s.defaultWriteObject();}}}

SynchronizedMap 实现了Map接口的代理类,该类中对Map接口中的方法还是使用synchronized 同步关键字来保证对Map的操作是线程安全的

synchronized(mutex) {/*****/}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【经典珍藏版】手把手全程教你制作漂亮的720全景地图(附PtGui软件下载地址)

如今,在网络异常发达的信息与智能测绘时代,我们可以在手机、笔记本电脑等多种设备上随时随地看到很漂亮的全景照片,仰以观于天文,俯以察于地理,可以全景图片视频拍摄,可以任意放大缩小、漫游、重力感应、VR眼睛虚拟体验等等,其乐无穷。作为一个GISer,采集地理信息,探索…

一篇文带你从0到1了解建站及完成CMS系统编写

学习目标 了解搭建一般网站的简便方式了解最原始一般站点搭建了解内容管理站点搭建了解权限设计及完成了解使用设计模式减少代码冗余了解前端拖拽页面生成及生成了解自定义数据的创建了解动态生成的前端页如何绑定自定义数据 开发环境 Windows7 *64 SP1php5.6apache/nginxth…

判断输入的整数是否为素数_C语言 | 判断是否素数

“要成为绝世高手&#xff0c;并非一朝一夕&#xff0c;除非是天生武学奇才&#xff0c;但是这种人…万中无一”——包租婆这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数&#xff0c;我们大多数人想要从C语言小白进阶到高手&#xff0c;需要经历的是…

Button的设置及各种属性

&#xff08;1&#xff09;UIButton类继承自UIControl&#xff0c;而UIControl继承自UIView&#xff0c;因为UIView就是个矩形区域&#xff0c;所以UIButton实例化的对象其实都是一个矩形&#xff0c;虽然有各种圆角、增加联系人、信息按钮等等&#xff0c;给它们加个背景它们就…

『技术群里聊些啥』Task 不是你想 Cancel,想 Cancel 就能 Cancel

前言在群里看到有人问如何取消这个 Task 的执行&#xff1a;实际上这并不会取消S1eepMode1方法的执行&#xff1a;这是为什么呢&#xff1f;原因首先&#xff0c;让我们看看s_cts.Cancel()都做了啥&#xff1a;public void Cancel() > Cancel(false);public void Cancel(boo…

SQL Server数据库锁的类型、用法及注意事项详解

一、为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新:A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读:A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数…

Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别

一、 HashMap 1&#xff09;底层实现 数组链表红黑树&#xff08;在JDK1.8中如果链表长度大于8的时候才转换为红黑树) 2&#xff09;是否线程安全不支持线程的同步&#xff0c;线程不安全&#xff0c;如需同步&#xff0c;可用Collections的synchronizedMap方法或者使用Concu…

《零基础看得懂的C语言入门教程 》——(八)了解基本数组还不是那么简单

一、学习目标 了解数组的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff08;二&#xff09;C语言没那么难简单开发带你了解流程 第…

推导坐标旋转公式(转)

在《Flash actionScript 3.0 动画教程》一书中有一个旋转公式&#xff1a; x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x&#xff0c;y表示物体相对于旋转点旋转angle的角度之前的坐标&#xff0c;x1&#xff0c;y1表示物体旋转angle后相对于旋转点的坐标 …

任务管理平台_jytask一个任务调度统一管理平台

task介绍和使用https://gitee.com/yuejing/task 下的文档&#xff1a;[doc/task介绍和使用.docx]task是什么&#xff1f;task是一个任务调度统一管理平台。 目前主要是通过http来进行任务的调度&#xff0c;http支持签名算法。一张图能更加懂它是做什么的(一个集中管理任务的平…

设计一个支持百万用户的系统

设计一个支持数百万用户的系统是非常有挑战性的, 这是一个需要不断调整和优化的过程, 接下来的内容中, 我将构建一个系统, 从单个用户开始&#xff0c;到最后支持数百万的用户。从单个服务开始 千里之行&#xff0c;始于足下&#xff0c;让我们从最简单的单个服务开始。所有的…

SQL Server T-SQL编程:数据库用户与安全设置

目录 一、数据库的注册、用户建立 二 、用户安全设置:角色

原百万访问量博客http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)...

原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护&#xff08;数百篇oracle/teradata性能优化、故障处理原创文章&#xff09;转载于:https://www.cnblogs.com/zhjh256/p/5497797.html

《零基础看得懂的C语言入门教程 》——(九)C语言二维数组与循环嵌套

一、学习目标 了解二维数组的使用方法了解循环嵌套的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff08;二&#xff09;C语言没那么…

LRU算法

1 LRU算法 LRU(Least recently used,最近最少使用)根据数据的历史访问记录来进行淘汰数据,思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 2 具体实现过程 新数据插入到链表头部; 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 当链表满…

Scala-2.13.0 安装及配置

Scala 简介 Scala 是一门多范式&#xff08;multi-paradigm&#xff09;的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上&#xff0c;并兼容现有的Java程序。 Scala 源代码被编译成Java字节码&#xff0c;所以它可以运…

检测python进程是否存活

crontab -e */3 * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log 2>&1 1 0 1 * * /data/jx3log_import_realtime/shutdown.sh 说明&#xff1a;每3分钟检查一次进程是否存在&#xff0c;每个月1号0点1分杀掉进程&#xff0c;重启 check.sh cd …

中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍

一、使用SDK Manager的文件夹安装Jetson软件(以NX为例)当JETPACK安装出现错误的时候&#xff0c;可以尝试下面的安装办法&#xff0c;前提是JETPACK4.4完整安装(即本文第三节的下载已经完成)&#xff0c;并且选择JETSON NX的相关的下载已经完成。安装步骤&#xff1a;1、$cd /n…

站在前人的肩膀上重新透视C# SpanT数据结构

先谈一下我对Span的看法&#xff0c; Span是指向任意连续内存空间的类型安全、内存安全的视图&#xff0c;可操作的滑动窗口。Span和Memory都是包装了可以在pipeline上使用的结构化数据的内存缓冲器,他们被设计用于在pipeline中高效传递数据。定语解读这里面许多定语&#xff0…

集合学习

List集合&#xff1a;ArrayList集合基于动态数组结构&#xff0c;查询优&#xff0c;LinkedList 基于链表结构 数据移动优。是一个有序的队列集合 set集合&#xff1a;HashSet和TreeSet 。是一个无序不重复集合 Map集合&#xff1a;HashMap和TreeMap。是一个KEY-VALUE映射的集合…