使用密钥来同步对代码块的访问

2024-03-01

通常我会锁定如下所示的关键部分。

public class Cache {
    private Object lockObject = new Object();

    public Object getFromCache(String key) {
        synchronized(lockObject) {

            if (cache.containsKey(key)) {
                // key found in cache - return cache value
            }
            else {
                // retrieve cache value from source, cache it and return
            }
        }
    }
}

我的想法是避免竞争条件,这可能导致数据源被多次命中并且密钥被多次添加到缓存中。

现在,如果两个线程大约同时进入不同的缓存键,我仍然会阻止一个。

假设钥匙是唯一的 - 通过锁定钥匙,锁还能工作吗?

我认为这是行不通的因为我知道对象引用应该相同才能使锁生效。我想这取决于它如何检查平等。

public class Cache {

    public Object getFromCache(String key) {
        synchronized(key) {

            if (cache.containsKey(key)) {
                // key found in cache - return cache value
            }
            else {
                // retrieve cache value from source, cache it and return
            }
        }
    }
}

public class Cache {

    private static final Set<String> lockedKeys = new HashSet<>();

    private void lock(String key) throws InterruptedException {
        synchronized (lockedKeys) {
            while (!lockedKeys.add(key)) {
                lockedKeys.wait();
            }
        }
    }

    private void unlock(String key) {
        synchronized (lockedKeys) {
            lockedKeys.remove(key);
            lockedKeys.notifyAll();
        }
    }

    public Object getFromCache(String key) throws InterruptedException {
        try {
            lock(key);

            if (cache.containsKey(key)) {
                // key found in cache - return cache value
            }
            else {
                // retrieve cache value from source, cache it and return
            }

        } finally {
            unlock(key);
        }
    }

}
  • 最后尝试- 非常重要 - 即使您的操作抛出异常,您也必须保证在操作后解锁等待线程。
  • 如果您的后端分布在各个地方,它将无法工作多个服务器/JVM.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用密钥来同步对代码块的访问 的相关文章

  • Java泛型 - 实现像map这样的高阶函数

    我决定用 Java 编写一些常见的高阶函数 map filter reduce 等 这些函数通过泛型实现类型安全 但我在一个特定函数中遇到通配符匹配问题 为了完整起见 函子接口是这样的 The interface containing th
  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • 到底什么是哈希冲突

    HashMap 中的哈希冲突或哈希冲突并不是一个新主题 我遇到过几个博客和讨论板 以模糊且详细的方式解释如何产生哈希冲突或如何避免它 我最近在一次采访中遇到了这个问题 我有很多事情要解释 但我认为很难准确地给出正确的解释 抱歉 如果我的问题
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • Visual Studio Code - Java 类路径不完整。只会报告语法错误

    在使用 python 获得了丰富的经验之后 我正在使用 java 迈出第一步 我正在运行的脚本是一个简单的 Java Swing Gui 它可以从命令行和 VS Code 中正常编译和运行 为了设置 java 调试环境 我使用 github
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 在 Streamreduce 方法中,求和时恒等式必须始终为 0,乘​​法时恒等式必须始终为 1?

    我继续java 8学习 我发现了一个有趣的行为 让我们看一下代码示例 identity value and accumulator and combiner Integer summaryAge Person getPersons stre
  • Java 应用程序启动,ProcessBuilder 一段时间后被阻止

    我正在开发一个 Java 桌面应用程序 我们称之为控制台 包含 3 个按钮 其中两个启动 Win32 应用程序 第三个应该启动一个可执行的 jar ProcessBuilder pb new ProcessBuilder java jar
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • 从我的控制器而不是从我的 asp.net mvc Web 应用程序中的视图调用 JSON API

    我需要从我的 asp net mvc Web 应用程序调用 BPM 引擎的 JSON API 对 BPM 的 API 调用构造如下 http localhost 8080 jw web json workflow process list
  • 如何防止XDocument添加XML版本和编码信息

    尽管在以下代码中使用了 SaveOptions DisableFormatting 选项 XDocument xmlDoc XDocument Load FileManager SourceFile string element campa
  • 将 Keras 模型的输出重新缩放回原始比例

    我是神经网络的新手 只是免责声明 我有一个基于 8 个特征预测混凝土强度的回归问题 我首先做的是使用最小 最大标准化重新调整数据 Normalize data between 0 and 1 from sklearn preprocessi
  • 逻辑地址和物理地址之间的区别?

    我正在阅读 操作系统概念 现在正在读第 8 章 不过 我可以做一些澄清 或者保证我的理解是正确的 逻辑地址 根据书中所述 逻辑地址是由CPU生成的 这到底是什么意思 在执行生成的地址系统中 我假设当为程序编译代码时 该程序具有no知道代码将
  • 在C#中有效调整图像的对比度

    在 C 中是否有一种有效的方法来调整图像的对比度 我见过本文 http www gutgames com post Adjusting Contrast of an Image in C aspx它提倡进行逐像素操作 不快 我已经在一些地方
  • 通过 Wcf 序列化 Linq2Sql - 错误或误解?

    使用 Linq2Sql 作为 Wcf 服务的驱动程序 让我们从下往上 在底部 我们有调用 Linq2Sql 的方法 public virtual void UpdateCmsDealer CmsDealer currentCmsDealer
  • 正则表达式可选组

    我正在使用这个正则表达式 a z a z d a z a z d d 13 匹配这样的字符串 SH 6208069141055 BC000388 20110412101855 分为 4 组 SH 6208069141055 BC000388
  • 如何查看 gstreamer 调试输出?

    如何查看 GST CAT INFO GST DEBUG 等函数的输出 我是否需要自己使用调试级别设置来编译 gstreamer 还是可以在应用程序级别完成 可以使用 GST DEBUG 环境变量在 stderr 中打印调试消息 如果 gst
  • .NET:打开嵌入资源文件中的文件

    如何打开嵌入资源文件中的文件 例如硬盘上的文件 具有绝对路径 假设您有test xml文件嵌入到程序集中 你可以使用获取清单资源流 http msdn microsoft com en us library system reflectio
  • 如何在 OpenAPI (Swagger) 中定义枚举?

    有谁知道如何定义可能enumOpenAPI 2 0 定义中的值以便它们显示在 Swagger UI 的 模型 选项卡中 示例在这里 https petstore swagger io pet addPet有一个枚举选项status财产 如何
  • 阻止应用程序[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要制作一个应用程序来阻止手机上的
  • 我可以用 Python 编写屏幕截图吗

    是否有任何库可用于在 Python 中编写屏幕截图 可以做成跨平台的吗 可以捕捉到视频吗 如果可以实时进行吗 或者说可以直接 生成Flash电影 屏幕捕获可以通过以下方式完成PIL 得益于 ImageGrab 模块 http www pyt
  • Firebase 函数 - https onRequest“HTTP 错误:400,请求有错误”

    我的 firebase 功能遇到一些重大问题 我正在尝试创建一个https请求以便我可以将数据发送到 Firebase 我有一个超级简单的代码只是为了测试 它会导致错误 这是我的代码 这段代码应该没有问题 exports fetchPost
  • Symfony 表单,错误冒泡

    我遇到了表单错误冒泡的问题 我的表单中的一个字段定义如下 formBuilder gt add title text required gt true error bubbling gt false 我想向该字段添加一个这样的验证器 Ass
  • 如何在 Windows 10 预览版中安装应用程序请求路由 ARR 3.0?

    当我尝试安装应用程序请求路由时 出现错误 安装 Microsoft 应用程序请求路由 3 0 需要 IIS 版本 7 0 或更高版本 Windows 10有IIS 10 0 所以应该是可以的 但我猜微软还没有修复版本检查 有没有可用的解决方
  • 使用 Python BeautifulSoup 单击链接

    所以我是 Python 新手 我来自 PHP JavaScript 背景 但我只是想编写一个快速脚本来抓取网站和所有子页面以查找所有内容a标签有href属性 数一下有多少个 然后单击链接 我可以计算所有链接 但我不知道如何 单击 链接然后返
  • 识别python中的日期格式

    如何获取 python 中给定日期输入的日期格式 笔记 输入是由用户给出的 不是预定义的格式 他们可能会 给出任何类型的输入格式 下面的示例适用于 dd mm yyyy 格式 但这不在 我的情况 日期格式未预定义 datetime date
  • EditText 提示文本和图标

    我正在尝试创建一个带有提示的 EditText 作为图标和文本 但是提示文本位于中心 但我希望提示文本左对齐 以便提示图标和提示文本之间应该只有制表符空格 间隙 这是我尝试过的
  • Android:弃用 startManagingCursor 的原因是什么?

    弃用 startManagingCursor 的原因是什么 我的简单应用程序有一个表视图 其中包含数据库中的数据列表 所以 我现在在 onCreate 中拥有的内容 final Cursor cursor getDataFromDB sta
  • 使用密钥来同步对代码块的访问

    通常我会锁定如下所示的关键部分 public class Cache private Object lockObject new Object public Object getFromCache String key synchroniz