Java围绕参数值同步方法

2023-12-01

考虑以下方法:

public void upsert(int customerId, int somethingElse) {
  // some code which is prone to race conditions    
}

我想保护此方法免受竞争条件的影响,但这只有在两个线程具有相同的条件时才会发生customerId正在同时调用它。如果我制作整个方法synchronized它会降低效率,而且并不是真正需要的。我真正想要的是使其同步customerId。这对于 Java 来说是可能的吗?有没有内置的工具,或者我需要一个Map of Integers用作锁?

如果您认为我在这里做错了什么,也请随时提出建议:)

Thanks!


您正在寻找的概念称为分段锁定 or 条纹锁定。为每个客户配备一个单独的锁太浪费了(锁是相当重量级的)。相反,你想要分割将您的客户 ID 空间划分为合理数量的分区,以匹配所需的并行度。通常 8-16 就足够了,但这取决于方法所做的工作量。

这概述了一个简单的方法:

private final Object[] locks = new Object[8];

synchronized (locks[customerId % locks.length]) {
    ...implementation...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java围绕参数值同步方法 的相关文章

随机推荐

  • 检查 Console.ReadLine()!=null

    我正在为我的应用程序制作一个 CMD 并且发现当我检查 Console ReadLine null 时遇到了麻烦 string input Console ReadLine if input null SomeFunction input
  • CSS 多个多列 div

    我有一堆想要显示的项目 文本 图像 混合内容等 用户可以定义该项目出现在哪一行和哪一列 例如 在第 1 行中 可能有两个项目 列 都是图像 在第二行中 可能有三个项目 列 其中一个带有图像 另外两个为纯文本 哦 用户可以指定任何特定列 图像
  • 如何清除JavaScript中的敏感内存?

    我有一个登录表单 供用户输入他 她的密码 该表单绑定到 AngularJS 模型 假设在相应的控制器中 用户给出的密码可通过 scope password 实际的登录过程由以下函数调用处理 login scope email scope p
  • Metro 应用程序中的 FTP

    我正在尝试在 Metro 和 C 中创建 FTP 应用程序 但 System Net 中的 FTP 类已被删除 现在我不知道如何执行此操作 我研究过BackgroundUploader 但不明白如何恢复目录结构等 有没有人有这样做的经验 我
  • 无法在 Javascript 中进行递归调用

    当我尝试运行这个程序时 我在 Firefox 中收到一条错误消息 moveDate 在第 41 行未定义 参考行window setTimeout moveDate 100 有什么想法吗 我认为递归函数能够定义自己 然后调用自己 funct
  • 自定义位置非自定义控制 Google 地图 (v3 API)

    我希望能够调整地图类型控件的位置 我将其设置为右上角 但我需要将其缩小约 50 像素 我读到自定义控件可以填充 DIV 那么非自定义控件呢 我可以延长控制范围吗 下面是 API 为该控件生成的 HTML div class gmnoprin
  • Android 和布局

    我需要在视图中找到文本 文本 更多文本 应位于底部 center horizo ntal 文本 短文本 应位于右对齐位置 但距屏幕顶部约 10 文本 x x x x 应与屏幕中心对齐 第一四分之一的右 下对齐 文本 一些长文本 应该与屏幕第
  • 是否可以在 JAX-RPC java 客户端中访问原始 SOA/XML 消息?

    我正在尝试通过 JAX RPC java 客户端访问 XML 响应 我一直在研究 Axis 自定义处理程序 但看起来它们仅在服务端有用 下面的一些代码将返回 XML 响应有效负载 您可以直接从 AXIS Stub 类获取它 也可以从将其写入
  • 如何在Chrome扩展程序列表中设置宣传图片? [关闭]

    Closed 这个问题是无关 目前不接受答案 我可以看到很多 Chrome 扩展程序在列表中都有宣传图片 以 Gmail 为例 我找不到在开发人员仪表板中设置此图像的位置 如何 参观开发者仪表板并单击编辑链接 向下滚动 屏幕截图部分下方 然
  • sed 移动一行

    我只需要在 sed 中移动一行 我可以选择该行 sed i 7s 我需要将第 7 行向上移动 2 行 这样它将成为第 5 行 如果没有复杂的脚本 我在互联网上找不到任何东西可以做到这一点 我找不到将特定行移动特定次数的简单解决方案 seq
  • 从 ASP.NET C# 应用程序使用 PHP Web 服务(SOAP、WSDL) - 数组问题

    我有一个 Web 服务 用 PHP 定义 WSDL 和实现 这一项比较简单 重要的位定义如下
  • 硫化 Angular.dart?

    有硫化就像 Polymer dart 工具 由 Polymer Transformer 完成 一样 它可以很好地将所有导入的组件内联起来 并通过减少到服务器的往返次数来轻松为应用程序提供服务 有没有像 vulcanize 这样的工具可以用于
  • 如何在转发器内创建嵌套链接按钮?

    我需要在 asp net 页面中创建一个嵌套的链接按钮 看起来像树视图 但都是链接按钮 示例如下所示 ParentLinkButton1 ChildLinkButton1 ChildLinkButton2 ChildLinkButton3
  • 如何将 Visual Studio 2010 与 Visual C++ 2008 编译器一起使用?

    我想使用 Visual Studio 2010 和 9 0 编译器 我该怎么做 我需要这个以便我可以使用 DarkGDK 但是我不想切换 IDE 就在您的项目属性中 平台工具集 默认为 v100 只需将其更改为 v90 即可
  • RDLC 表达式导致#error

    我有两个小数字段 利润和收入 它们显示在 Tablix 控件中 每个控件都有自己的列 在第三列中 我想将利润除以收入 当这些字段中的任何一个为零时 结果是 error 我猜测这是由于除以零造成的 我想出了以下表达式来解决这个问题 iif C
  • R闪亮:如何在数据框中嵌入sliderInputs/selectInputs和radioButtons? (错误:无法将“shiny.tag”类强制到 data.frame)

    我需要在矩阵中嵌入不同类型的输入 它适用于 textInput 和 numericInput 但我找不到 selectInput sliderInput 和 radioButton 的方法 我可以在 HTML 中指定 textInput 和
  • C++中字符的指针

    根据书本 第一行 cout 应该打印我所在位置的地址字符变量 b被存储 这似乎是这种情况整型变量a也 但是第一个 cout 语句打印出一个奇怪的结果 dh 而第二条语句正确打印十六进制值 ox23fd68 为什么会发生这种情况 includ
  • 缺少必需的参数,包括无效的参数值,使用 LinkedIn API 多次参数

    我尝试使用 OAuth2 使用 LinkedIn API 进行身份验证 代码 if isset GET code AND isset GET state code GET code state GET state curl request
  • Beautiful Soup 并通过 ID 提取 div 及其内容

    soup find tagName id articlebody 为什么这不返回 div div 标签和中间的东西 它什么也不返回 我知道它确实存在 因为我正盯着它 soup prettify soup find div id articl
  • Java围绕参数值同步方法

    考虑以下方法 public void upsert int customerId int somethingElse some code which is prone to race conditions 我想保护此方法免受竞争条件的影响