也许ConcurrentHashMap可以帮到你.顾名思义,它支持并发修改.

要只创建一个新元素,您可以执行以下操作:

private Map map = new ConcurrentHashMap<>();

private final Object lock = new Object();

public Thing getById(String id) {

Thing t = map.get(id);

if (t == null) {

synchronized(lock) {

if (!map.containsKey(id)) {

t = //create t

map.put(id, t);

}

}

}

return t;

}

一次只允许一个线程创建新的东西,但是对于现有的值,没有任何锁定.

如果你想完全避免锁定,你必须使用2个地图,但它有点令人费解,如果你真的希望很多线程不断地填充地图,那么它是值得的.对于这种情况,最好将FutureTasks与线程池一起使用,以异步方式创建对象,最大限度地减少锁定的时间(您仍需要锁定,以便只有一个线程创建新元素).

代码将是这样的:

private Map> map = new ConcurrentHashMap<>();

private final Object lock = new Object();

ExecutorService threadPool = ...;

public Thing getById(String id) {

Future t = map.get(id);

if (t == null) {

synchronized(lock) {

if (!map.containsKey(id)) {

Callable c = //create a Callable that creates the Thing

t = threadPool.submit(c);

map.put(id, t);

}

}

}

return t.get();

}

锁定仅在创建Callable所需的时间内存在,将其提交到线程池以获取Future,并将Future置于地图中. Callable将在线程池中创建元素,当它返回元素时,Future的get()方法将解锁并返回其值(对于任何等待的线程;后续调用不会锁定).

java 资源锁定_如何在Java中创建时正确锁定资源相关推荐

  1. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...

    如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...

  2. html树状图右侧_如何在 Tableau 中创建控制图?

    本文作者:Jose Valero 控制图是用于研究流程如何随时间变化,并确定制造或业务流程是否在统计控制状态下的图表. 我相信这对每家公司来说都是一个有益的工具,所以在这篇文章中,我将尝试如何在 Ta ...

  3. vue 递归创建菜单_如何在Vue中创建类似中等的突出显示菜单

    vue 递归创建菜单 by Taha Shashtari 由Taha Shashtari 如何在Vue中创建类似中等的突出显示菜单 (How to Create a Medium-Like Highl ...

  4. figma下载_如何在Figma中创建逼真的3D对象

    figma下载 by Gbolahan Taoheed Fawale 通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create reali ...

  5. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?

    问题阐述 自MySQL 5.0 开始,MySQL 就支持存储过程.存储过程是一些被用户定义的SQL 语句集合.一个存储程序是可以被存储在服务器中的一套SQL 语句.存储过程可以被程序.触发器或另一个存 ...

  6. wordpress 数据库_如何在WordPress中创建视频库(逐步)

    wordpress 数据库 Recently, a user asked us how to create a video gallery in WordPress. WordPress makes ...

  7. wordpress创建_如何在WordPress中创建问卷(简易方式)

    wordpress创建 Do you want to create a questionnaire in WordPress to survey your visitors or collect da ...

  8. wordpress创建_如何在WordPress中创建子页面

    wordpress创建 Do you want to create a child page on your site? Pages in WordPress can be standalone or ...

  9. wordpress模板_如何在WordPress中创建类别模板

    wordpress模板 Have you visited a site where each category has different layout? In WordPress theme dev ...

最新文章

  1. keepalived+httpd 做web服务的高可用
  2. Crawler之Scrapy:数据挖掘必备的scrapy框架之最完整爬取网页内容攻略
  3. glonee刷机绿色机器人无命令_小图编程机器人评测:寓教于乐,让编程变得简单有趣...
  4. Java 抽象类和抽象方法
  5. multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8‘ not supporte
  6. linux下udf光盘权限问题,linux - 关于mysql udf权限的问题?
  7. 56. Merge Intervals - LeetCode
  8. android mp3文件图片,android 完美获取音乐文件中的专辑图片并显示
  9. MySQL四种SQL性能分析工具
  10. 【数字图像处理5.3】SLIC算法 超像素分割(无监督聚类方式)python
  11. “蓝桥杯”练习系统——ALGO-847 盾神与简单数独
  12. 华师大学 计算机 调剂,2020华南师范大学调剂公告
  13. 日本风俗业数据_神奇宝贝如何融入日本民俗
  14. 全国强制安装H6S国六柴油车载排放OBD诊断系统在线检测类终端
  15. 全国计算机等级考试证书电子,全国计算机等级考试证书效力
  16. 【神经网络结构搜索综述】NAS的挑战和解决方案
  17. linux命令 查看分辨率,linux怎样在命令行模式修改屏幕分辨率
  18. 图片文字翻译的软件有哪些?快收藏这几款实用的软件
  19. 北朝皇帝简介-20170610
  20. 量化投资学习——股指期货ETF套利

热门文章

  1. LeetCode872. Leaf-Similar Trees
  2. SpringBoot 封装返回类以及session 添加获取
  3. 洛谷P1901 发射站
  4. Ajax-基础篇(持续更新01)
  5. MySQL中alter table range partition
  6. 你搞清楚「NULL」、「0」、「'0'」、「0」「\0」了吗?
  7. 你见过出道即巅峰吗?
  8. 这道笔试题竟然运行不出错
  9. Android系统架构开篇
  10. Android ADB 源码分析(三)