java map同步访问_同步 - Java synchronized块与Collections.synchronizedMap
您的代码中可能存在细微的错误。
[更新:因为他正在使用map.remove(),所以这种描述并不完全有效。 我第一次错过了这个事实。 :(感谢问题的作者指出这一点。我将其余部分保留原样,但改变了主要声明,说有可能存在错误。]
在doWork()中,您可以以线程安全的方式从Map获取List值。 然而,之后,您在不安全的情况下访问该列表。 例如,一个线程可能正在使用doWork()中的列表,而另一个线程在addToMap()中调用synchronizedMap.get(key).add(value)。 这两个访问不同步。 经验法则是集合的线程安全保证不会扩展到它们存储的键或值。
你可以通过在地图中插入一个同步列表来解决这个问题
List valuesList = new ArrayList();
valuesList.add(value);
synchronizedMap.put(key, Collections.synchronizedList(valuesList)); // sync'd list
或者,您可以在doWork()中访问列表时在地图上进行同步:
public void doWork(String key) {
List values = null;
while ((values = synchronizedMap.remove(key)) != null) {
synchronized (synchronizedMap) {
//do something with values
}
}
}
最后一个选项会稍微限制并发性,但IMO会更加清晰。
另外,关于ConcurrentHashMap的快速说明。 这是一个非常有用的类,但并不总是适用于同步HashMaps的替代品。 引用其Javadocs,
在依赖于线程安全但不依赖于其同步细节的程序中,此类可与Hashtable完全互操作。
换句话说,putIfAbsent()非常适合原子插入,但不保证在该调用期间地图的其他部分不会改变; 它只保证原子性。 在您的示例程序中,您依赖于put()s以外的(同步)HashMap的同步详细信息。
最后一件事。 :)来自Java Concurrency in Practice的这句精彩报价总能帮助我设计调试多线程程序。
对于可由多个线程访问的每个可变状态变量,必须在保持相同锁的情况下执行对该变量的所有访问。
java map同步访问_同步 - Java synchronized块与Collections.synchronizedMap相关推荐
- java map类说_在Java中,关于HashMap类的描述,以下说法错误的是( )。
[单选题]所谓覆盖,也称为重写,是指子类中定义了一个与父类某一方法具有相同型构的方法,这里所说的相同型构所指的不是(). [填空题(主观)]半导体二极管实质上是由 [填空(1)] 构成,其主要特性是 ...
- java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...
最近在做一个项目,要在判断用户是否是通过手机访问网站的,如果是手机访问网站跳到一个登录页面,如果是用户用电脑访问网站跳到另外一个登录页面.我写了以下代码,但是用手机访问网站的时候,跳转不到制定页面,请 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable
线程 1 线程概述 1.1 什么是线程 v 线程是程序执行的一条路径, 一个进程中可以包含多条线程 v 一个应用程序可以理解成就是一个进程 v 多线程并发执行可以提高程序的效率, 可以同时完成多 ...
- scala和java像不像_关于Java和Scala同步的五件事你不知道
scala和java像不像 实际上,所有服务器应用程序都需要在多个线程之间进行某种同步. 大多数同步工作是在框架级别为我们完成的,例如通过我们的Web服务器,数据库客户端或消息传递框架. Java和S ...
- java io null异常_大量java.lang.InterruptedException: null异常,数据没有同步
otter运行了一段时间后,就停止了同步,Channel状态也是running的 , 查看日志出现大量的InterruptedException,看不出哪里出了问题 2017-07-14 17:51: ...
- java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用
简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...
- java锁性能对比_提高Java的锁性能
java锁性能对比 Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案. 几个月前,我们在Plumbr中引入了锁定线程检测之后,我们开始收到类似于"嘿 ...
- java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?
为什么Java向量被认为是遗留的类,过时的或被弃用的? 使用并发时,它的使用是否有效? 如果我不想手动同步对象,只想使用线程安全集合而不需要对底层数组进行新的复制(如CopyOnWriteArrayL ...
最新文章
- Xamarin Android项目运行失败
- http头部信息解析
- Windows 2003 R2的文件服务器实施
- agc015F Kenus the Ancient Greek
- python写web难受-pythonweb为什么不火-问答-阿里云开发者社区-阿里云
- python while函数_详解python while 函数及while和for的区别
- animation of android (1)
- iBatis 2.x 和 MyBatis 3.0.x 的区别
- Elasticsearch 操作命令
- 在C#中调用Java代码
- 微信小程序 获取php值,微信小程序如何获取javascript里的数据
- Linux操作系统加固
- 【2020】【论文笔记】太赫兹新型探测——太赫兹特性介绍、各种太赫兹探测器
- 08#wordcloud2包 词云生成器
- Hadoop安装snappy(编译源码)
- 广播电视相关信息系统安全 等级保护测评要求
- 适配器模式(Adapter)
- TutorialsPoint NumPy 教程
- `Error:(11) No resource identifier found for attribute 'srcCompat' in package 'com.codifythings.ligh
- GWAS相关名词解释及基础知识储备[长期更新]
热门文章
- 电脑长时间睡眠会自动关机吗_长期对着电脑皮肤会变黑吗?经常对电脑如何保护皮肤?...
- 教育大数据隐私保护机制与技术研究
- 作者:高丰,英国南安普敦大学计算机博士,现为开放数据与创新独立咨询顾问,兼复旦大学数字与移动治理实验室特邀研究员。...
- 陈一舟:我们花了大力气找合适团队接力人人网 任务完成
- birt报表的行隐藏和列隐藏以及分组显示
- python核心编程:杂记2
- 对于访问IIS元数据库失败的解决
- 技术女性的是是非非(2)
- 码农回忆刚毕业工作的那年
- 【转载】SQL 模糊查询