您的代码中可能存在细微的错误。

[更新:因为他正在使用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相关推荐

  1. java map类说_在Java中,关于HashMap类的描述,以下说法错误的是(   )。

    [单选题]所谓覆盖,也称为重写,是指子类中定义了一个与父类某一方法具有相同型构的方法,这里所说的相同型构所指的不是(). [填空题(主观)]半导体二极管实质上是由 [填空(1)] 构成,其主要特性是 ...

  2. java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...

    最近在做一个项目,要在判断用户是否是通过手机访问网站的,如果是手机访问网站跳到一个登录页面,如果是用户用电脑访问网站跳到另外一个登录页面.我写了以下代码,但是用手机访问网站的时候,跳转不到制定页面,请 ...

  3. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  4. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  5. scala和java像不像_关于Java和Scala同步的五件事你不知道

    scala和java像不像 实际上,所有服务器应用程序都需要在多个线程之间进行某种同步. 大多数同步工作是在框架级别为我们完成的,例如通过我们的Web服务器,数据库客户端或消息传递框架. Java和S ...

  6. java io null异常_大量java.lang.InterruptedException: null异常,数据没有同步

    otter运行了一段时间后,就停止了同步,Channel状态也是running的 , 查看日志出现大量的InterruptedException,看不出哪里出了问题 2017-07-14 17:51: ...

  7. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用

    简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...

  8. java锁性能对比_提高Java的锁性能

    java锁性能对比 Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案. 几个月前,我们在Plumbr中引入了锁定线程检测之后,我们开始收到类似于"嘿 ...

  9. java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?

    为什么Java向量被认为是遗留的类,过时的或被弃用的? 使用并发时,它的使用是否有效? 如果我不想手动同步对象,只想使用线程安全集合而不需要对底层数组进行新的复制(如CopyOnWriteArrayL ...

最新文章

  1. Xamarin Android项目运行失败
  2. http头部信息解析
  3. Windows 2003 R2的文件服务器实施
  4. agc015F Kenus the Ancient Greek
  5. python写web难受-pythonweb为什么不火-问答-阿里云开发者社区-阿里云
  6. python while函数_详解python while 函数及while和for的区别
  7. animation of android (1)
  8. iBatis 2.x 和 MyBatis 3.0.x 的区别
  9. Elasticsearch 操作命令
  10. 在C#中调用Java代码
  11. 微信小程序 获取php值,微信小程序如何获取javascript里的数据
  12. Linux操作系统加固
  13. 【2020】【论文笔记】太赫兹新型探测——太赫兹特性介绍、各种太赫兹探测器
  14. 08#wordcloud2包 词云生成器
  15. Hadoop安装snappy(编译源码)
  16. 广播电视相关信息系统安全 等级保护测评要求
  17. 适配器模式(Adapter)
  18. TutorialsPoint NumPy 教程
  19. `Error:(11) No resource identifier found for attribute 'srcCompat' in package 'com.codifythings.ligh
  20. GWAS相关名词解释及基础知识储备[长期更新]

热门文章

  1. 电脑长时间睡眠会自动关机吗_长期对着电脑皮肤会变黑吗?经常对电脑如何保护皮肤?...
  2. 教育大数据隐私保护机制与技术研究
  3. 作者:高丰,英国南安普敦大学计算机博士,现为开放数据与创新独立咨询顾问,兼复旦大学数字与移动治理实验室特邀研究员。...
  4. 陈一舟:我们花了大力气找合适团队接力人人网 任务完成
  5. birt报表的行隐藏和列隐藏以及分组显示
  6. python核心编程:杂记2
  7. 对于访问IIS元数据库失败的解决
  8. 技术女性的是是非非(2)
  9. 码农回忆刚毕业工作的那年
  10. 【转载】SQL 模糊查询