java 资源锁定_如何在Java中创建时正确锁定资源
也许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中创建时正确锁定资源相关推荐
- hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...
如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...
- html树状图右侧_如何在 Tableau 中创建控制图?
本文作者:Jose Valero 控制图是用于研究流程如何随时间变化,并确定制造或业务流程是否在统计控制状态下的图表. 我相信这对每家公司来说都是一个有益的工具,所以在这篇文章中,我将尝试如何在 Ta ...
- vue 递归创建菜单_如何在Vue中创建类似中等的突出显示菜单
vue 递归创建菜单 by Taha Shashtari 由Taha Shashtari 如何在Vue中创建类似中等的突出显示菜单 (How to Create a Medium-Like Highl ...
- figma下载_如何在Figma中创建逼真的3D对象
figma下载 by Gbolahan Taoheed Fawale 通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create reali ...
- 如何在mysql中创建过程_如何在MySQL 中创建存储过程?
问题阐述 自MySQL 5.0 开始,MySQL 就支持存储过程.存储过程是一些被用户定义的SQL 语句集合.一个存储程序是可以被存储在服务器中的一套SQL 语句.存储过程可以被程序.触发器或另一个存 ...
- wordpress 数据库_如何在WordPress中创建视频库(逐步)
wordpress 数据库 Recently, a user asked us how to create a video gallery in WordPress. WordPress makes ...
- wordpress创建_如何在WordPress中创建问卷(简易方式)
wordpress创建 Do you want to create a questionnaire in WordPress to survey your visitors or collect da ...
- wordpress创建_如何在WordPress中创建子页面
wordpress创建 Do you want to create a child page on your site? Pages in WordPress can be standalone or ...
- wordpress模板_如何在WordPress中创建类别模板
wordpress模板 Have you visited a site where each category has different layout? In WordPress theme dev ...
最新文章
- keepalived+httpd 做web服务的高可用
- Crawler之Scrapy:数据挖掘必备的scrapy框架之最完整爬取网页内容攻略
- glonee刷机绿色机器人无命令_小图编程机器人评测:寓教于乐,让编程变得简单有趣...
- Java 抽象类和抽象方法
- multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8‘ not supporte
- linux下udf光盘权限问题,linux - 关于mysql udf权限的问题?
- 56. Merge Intervals - LeetCode
- android mp3文件图片,android 完美获取音乐文件中的专辑图片并显示
- MySQL四种SQL性能分析工具
- 【数字图像处理5.3】SLIC算法 超像素分割(无监督聚类方式)python
- “蓝桥杯”练习系统——ALGO-847 盾神与简单数独
- 华师大学 计算机 调剂,2020华南师范大学调剂公告
- 日本风俗业数据_神奇宝贝如何融入日本民俗
- 全国强制安装H6S国六柴油车载排放OBD诊断系统在线检测类终端
- 全国计算机等级考试证书电子,全国计算机等级考试证书效力
- 【神经网络结构搜索综述】NAS的挑战和解决方案
- linux命令 查看分辨率,linux怎样在命令行模式修改屏幕分辨率
- 图片文字翻译的软件有哪些?快收藏这几款实用的软件
- 北朝皇帝简介-20170610
- 量化投资学习——股指期货ETF套利