ConcurrentHashMap只能保证单个操作的原子性,你先get再put,整个操作不是原子性操作,因此是会出现覆盖的问题的。用java.util.concurrent.ConcurrentHashMap#replace(K, V, V)方法的话需要加上失败重试,不然在并发的情况下基本是会出现一个线程无法完成替换的情况的。

这个需求使用java.util.concurrent.ConcurrentHashMap#computeIfPresent方法实现起来会方便一点。

jdk7可能没有这个方法,需要jdk8或以上版本

public static void main(String[] args) throws InterruptedException {

final ConcurrentHashMap map = new ConcurrentHashMap<>();

map.put(3, "null, null");

ExecutorService executorService = Executors.newFixedThreadPool(2);

//模拟并发

CountDownLatch latch = new CountDownLatch(1);

Runnable replace = () -> {

try {

//模拟准备时间

Thread.sleep(ThreadLocalRandom.current().nextLong(3000));

//等待

System.out.println(String.format("线程%s就绪@%d", Thread.currentThread().getId(), System.currentTimeMillis()));

latch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(String.format("线程%s替换前:%s", Thread.currentThread().getId(), map.get(3)));

map.computeIfPresent(3, (k, v) -> v.replaceFirst("null", String.valueOf(System.currentTimeMillis())));

System.out.println(String.format("线程%s替换后:%s", Thread.currentThread().getId(), map.get(3)));

};

executorService.execute(replace);

executorService.execute(replace);

//等待准备完成

Thread.sleep(4000L);

latch.countDown();

//等待完成替换

Thread.sleep(300L);

System.out.println(map.get(3));

executorService.shutdown();

}

java 多线程 map_多线程Map并发读后修改相关推荐

  1. Java实战(第二版)读后总结与感想

    1. 基本信息 Java 实战(第二版)Modern Java in Action, 2nd Edition [英] 拉乌尔–加布里埃尔·乌尔玛(Raoul-Gabriel Urma),[意] 马里奥 ...

  2. java 定义map_定义map%3ck_v%3e,Java中定义Map恒量,List常量

    Java中定义Map常量,List常量 一般的方式的使用静态代码块.比如: public final static Map map = new HashMap(); static { map.put( ...

  3. java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)

    1. 多线程基础 首先要明白一些概念: 进程:把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程. 线程:某些进程内部还需要同时执行多个子任务.例 ...

  4. (四)Java中的多线程之间实现同步+多线程并发同步

    一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...

  5. java list 多线程add_Java多线程并发中支持并发的list对象

    Java多线程并发编程中并发容器第二篇之List的并发类讲解 概述 本文我们将详细讲解list对应的并发容器以及用代码来测试ArrayList.vector以及CopyOnWriteArrayList ...

  6. Java学习笔记---多线程并发

    Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...

  7. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  8. Java——使用多线程模拟真实高并发业务并保证安全性(一)

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[javaUp],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料.技术 ...

  9. Java中的多线程你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

最新文章

  1. SynchronousQueue原理解析
  2. 联想笔记本电脑的F1至F12键盘问题。怎么设置才能不按FN就使用F1
  3. php使用office modi吗,使用phpoffice/phpexcel拓展读取excel内容卡死解决
  4. 【SQL】存储过程procedure 触发器trigger
  5. Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心
  6. ubuntu 10.04   花屏   启动缓慢   处理办法
  7. 成功与不成功并非智商差别:男人,如何唤醒心灵的巨人
  8. struts2的package和result的标签的属性
  9. ‘vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件的报错
  10. CString和string的互相转换
  11. linux 反汇编运行时代码段,linux内核学习之一 简单c语言反汇编(示例代码)
  12. 金蝶生成凭证模板_凭证模板
  13. iMX8MP方案推荐|一款适用于心电监护仪的嵌入式核心板
  14. 计算机英文电子书分享
  15. android iphone 开发者选项,手机开发者选项中的妙用,让你的安卓系统流畅如iOS
  16. Android应用商店——项目介绍
  17. 使用DISM修复系统
  18. php mysql函数未定义,关于php:Wierd和Annoying错误:调用未定义的函数mysql_query()...
  19. 机器学习相关学习视频
  20. 关于笔记本电脑修改显示器刷新频率后,重新开机时会自动修改为上一次的频率问题

热门文章

  1. vue 使用gtm代码代替ga代码作谷歌分析
  2. webdriver启动浏览器、设置profile加载插件步骤详解
  3. XML fragments parsed from previous mappers already contains value for 解决办法
  4. 抽象代数——群的基本定义和一些例子
  5. 510758-19-7,5-FAM-Alkyne高选择性和灵敏的荧光生物标记物,可用于标记碱性磷酸酶 (ALP)
  6. vscode网页显示_vscode怎么打开浏览器
  7. 公交卡管理系统C语言,关于NFC不能刷公交卡的研究(暂无方法)
  8. Vue 用户登入及token 认证
  9. 度过有意义的生命(下)
  10. 互联网晚报 | 8月16日 | iPhone14或仍有刘海;​百度回应前腾讯新闻负责人王诗沐是否加入;微信聊天对话框支持放大编辑...