Groovy Abstract ConcurrentMap 中的错误?

2024-02-01

抽象ConcurrentMap http://grepcode.sadcom/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java是Groovy中的核心类,它用于存储在运行时添加到Groovy类中的动态属性。我正在使用 Grails 2.1.2 和 Groovy 1.8.8,但我认为所有 Groovy 版本中都存在该问题(链接的源代码适用于 Groovy 版本 2.4.3)。

问题发生在内部类Segment中put() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#105方法(第 105 行):

  • 当当前计数大于map的阈值a时rehash() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMapBase.java#213发生。现在棘手的部分是,Map 保存对对象的软引用,并且rehash() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMapBase.java#213验证这些引用。因此,当 GC 丢弃软引用时,生成的段不会扩展(正如在put() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#100方法)。

  • in the rehash() 的最后一行 http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMapBase.java#283段内部计数器已更新count = newCount(这是“活动”未丢弃引用的数量,可以小于如上所述的先前计数)

  • after rehash() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMapBase.java#213完成后,put() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#100方法继续,但是有问题的部分是,它忽略了内部的先前设置count并在行中的每种情况下设置先前的 count+1 值124 http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#124, 143 http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#143 and 159 http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#159

因此正在发生以下步骤:

  1. 地图状态:threshold = 786432; count=786432
  2. 新元素被插入到地图中:count = 786433; threshold = 786432
  3. 因为新计数将大于阈值rehash() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMapBase.java#213 happens
  4. rehash() 发现,大多数对象都是垃圾收集的,因此它不会增加 Segment 的大小,但无论如何它会将所有对象从一个表复制到另一个表(System.arrayCopy())。
  5. rehash() 将内部计数设置为新值,该值较小,因为许多对象被垃圾收集(软引用),可以说:count = 486 000
  6. The put() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#105继续,忽略count = 486 000并将计数设置为count = 786433
  7. 插入了另一个元素,但是在这种状态下,计数仍然大于阈值,因此再次进行重新哈希
  8. 从现在开始,添加到地图的每个元素都会触发rehash() http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.groovy/groovy-all/2.4.3/org/codehaus/groovy/util/AbstractConcurrentMap.java#105,这对性能有巨大的影响。

当这种情况发生在多线程环境中时,所有其他线程都在等待(停放)lock(),直到 rehash() 和 put() 完成(然后下一个线程再次执行 rehash())。您可以想象这对性能有何影响......

我不明白这个错误如何能够在这么多版本中存在而没有人注意到,尽管该类被广泛使用。也许我错过了什么?

建议的解决方案:

重新哈希完成后更新 c 变量。 在第 105 行和第 106 行之间添加:

c = count + 1

该错误已在 Groovy JIRA 上报告https://issues.apache.org/jira/browse/GROOVY-7448 https://issues.apache.org/jira/browse/GROOVY-7448现在已修复。

Fix Version/s:
2.4.4, 2.5.0-beta-1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Groovy Abstract ConcurrentMap 中的错误? 的相关文章

  • Groovy/grails 如何判断一个数据类型?

    确定 groovy 中数据类型的最佳方法是什么 如果是日期等 我想以不同的方式格式化输出 要确定对象的类 只需调用 someObject getClass 您可以将其缩写为someObject class在多数情况下 但是 如果您在Map它
  • 是否可以使用 Groovy XMLSlurper 解析子树

    有谁知道是否可以以某种方式使用 XMLSlurper 这意味着可以从非常大的 XML 文档中提取各个子树并单独进行处理 想象一下 您有一个巨大的 XML 提要 其中包含一个根元素 该根元素具有数千个可以单独处理的直接子元素 显然 将整个文档
  • 在 gradle 中更新具有特定 id 的 xml 元素

    我想在 xml 文件中进行以下更改 我的测试 xml
  • 如何使用 Groovy 修剪列表中的所有元素?

    我需要在 groovy 或 grails 中修剪列表中的所有元素 最好的解决方案是什么 假设它是一个字符串列表 并且您想要修剪每个字符串 您可以使用扩展运算符 http groovy codehaus org Operators Opera
  • 如何简单地解析没有指定年份的日期?

    我有一个工具 它似乎可以给我日期 但没有指定我需要转换的年份 并且我正在使用 Java 来完成任务 实际上是 Groovy 但在本例中足够接近 示例日期是 13 Dec 12 00 00 它应该指的是 12 13 2011 因为年份未指定
  • Hibernate/JPA中涉及继承时如何指定列名?

    我想我想在这里鱼和熊掌兼得 但我们会看看是否有一个合理的解决方案来满足我正在寻找的问题 我有一个 Spring Boot JPA Hibernate 应用程序 它将与 MySQL 作为其后备存储进行通信 我有几种情况 从 OOP 的角度来看
  • Soapui 添加节点到请求 (Groovy)

    我遇到了问题 所以我得到了这样的 WSDL
  • 异步作业出错

    我正在尝试创建一个不会阻止请求的异步任务 用户发出请求 任务将启动 控制器将呈现 作业正在运行 这是为了避免请求被阻止等待任务完成 任务完成后 它将执行 onComplete 并对该任务的结果执行某些操作 例如调用将向用户发送邮件的服务 E
  • 如何在不更改 equals 和 hashcode 的情况下插入集合

    我正在寻找建议 我有一个Person具有字符串firstName和字符串lastName的类 当我试图插入具有相同字符串的列表值时 例如 set add new Person firstName lastName set add new P
  • Groovy - XmlNodePrinter 打印空白文件

    我正在尝试将格式化的 xml 打印到文件中 但我的 XmlNodePrinter 仅打印一个空白文件 我认为我传入的 xml 对象已正确填充 我可以使用 StreamingMarkupBuilder 打印它 但它的格式全部在一行上 我不知道
  • GPars:返回eachParallel{}

    我想对每个示例字符串做很多事情 并在此处返回一些其他类型的对象 整数 然后返回一些更大的类对象 在这个例子中 我正在尝试一些简单的事情 但我得到了完全错误的结果 至少对于我希望得到的东西 xD 我希望得到 6 5 6 5 但我得到的是 bu
  • 如何在 Jenkins Freestyle 项目中使用可锁定资源插件中的 Groovy 表达式

    这个问题是针对旧版本提出的可锁定资源插件 https wiki jenkins ci org display JENKINS Lockable Resources Plugin 旧版本中的错误自2 1版本以来已得到修复 然而 没有描述如何在
  • IntelliJ + Groovy + Spock:没有为模块定义 Groovy 库

    我一直在尝试在 IntelliJ IDEA 中创建一个带有 Spock 测试的 Groovy 项目 以下是我遵循的步骤 创建 Groovy 项目并添加 Maven 支持 添加了 Spock 依赖项和插件 我使用的 POM 与此非常相似 ht
  • Groovy 语言书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Groovy hasProperty/respondTo

    All the examples http mrhaki blogspot com 2009 10 groovy goodness check if method or html我看到使用hasProperty or respondsTo显
  • 使用 groovy 向 jenkins 作业添加附加参数

    我们有一组 groovy 脚本 用户可以在他们的 jenkins 文件中调用它们来设置一些常见的作业属性 但是 我们无法弄清楚在进行此更新时如何保留其现有参数 我们的常规代码片段 def newParamsList def newbool
  • 如何重定向 Groovy 脚本的输出?

    我想知道是否有任何方法可以更改我从 Java 代码执行的 groovy 脚本的默认输出 System out 这是Java代码 public void exec File file OutputStream output throws Ex
  • Jenkins 管道中的动态变量与 Groovy 方法变量

    我在 Groovy 中有一个用于声明性管道的 Jenkinsfile 以及两个创建的 Jenkins 变量 其名称为 OCP TOKEN VALUE ONE 和 OCP TOKEN VALUE TWO 以及相应的值 当我尝试传递方法变量并在
  • Groovy 和 Groovy++,它们有什么不同吗?

    我最近知道groovy 已经发布了 Groovy和Groovy 的主要区别是什么 来自 groovy 页面http code google com p groovypptest http code google com p groovypp
  • 部署 Grails 应用程序时出错 - 初学者

    我在部署 Grails 应用程序时遇到问题 一切都在本地测试环境中运行 ERROR localhost startStop 1 错误 context GrailsContextLoader 错误 初始化应用程序 使用名称创建 bean 时出

随机推荐

  • Django:多个帐户,每个帐户下有多个用户,但特定于帐户的数据

    这里使用 Django 1 5 我创建了一个应用程序 当前拥有一大组数据 如果您愿意的话 可以用于一个 帐户 这意味着我的应用程序中所有模型中的所有数据都可供所有登录用户使用 现在 我希望能够让更多的人使用我的应用程序 但使用他们自己的数据
  • JavaScript、node.js 在继续之前等待 socket.on 响应

    我需要从客户端的服务器获取信息 所以在服务器端 当客户端第一次连接时我得到了这个 socket on adduser function username misc code where i set num player and whatno
  • CircleCi 2.0 在子目录中处理项目

    我正在尝试整合我的springbootCircleCi 的教程项目 我的项目位于 Github 存储库内的子目录中 我从 CircleCi 收到以下错误 目标需要一个项目来执行 但其中没有 POM 目录 home circleci reci
  • 如何检测DrawerLayout是否开始打开?

    所以我想在导航抽屉中隐藏一些选项卡starts开放 我的代码在打开后隐藏了它们 但这不是我想要的 mDrawerToggle new ActionBarDrawerToggle this mDrawerLayout R drawable i
  • JavaScript(ES6) 将对象设置为 null 时 WeakMap 垃圾回收

    我刚刚读到 WeakMaps 通过专门使用对象作为键来利用垃圾收集 并且将对象分配给 null 相当于删除它 let planet1 name Coruscant city Galactic City let planet2 name Ta
  • 在函数类型签名中替换 => 代替 ->

    我只是观察到如果不是 gt 我写的 gt 在函数的类型签名定义中 它不会导致编译时错误 示例代码 mysum Num a gt a gt a Notice gt after the list a mysum 0 mysum x xs x m
  • dijit.Tree搜索和刷新

    我似乎无法弄清楚如何使用 ItemFileWriteStore 和 TreeStoreModel 在 dijit Tree 中进行搜索 一切都是声明性的 我使用的是 Dojo 1 7 1 这是我到目前为止所拥有的
  • VSCode 扩展修复 Python 选项卡不一致问题 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 首先 我想知道是谁决定使用基于缩进的语言的无脑天才 以及为什么他不能简单地使用分号 令人沮丧的是 Pyt
  • 使用模型时 CakePHP AJAX Json 解析错误

    我正在使用 CakePHP 2 5 3 0 开发一个应用程序 然后我偶然发现了 AJAX 的一个问题 我使用从 jQuery 到 CakePHP 的 AJAX 请求来发送用户的登录名和密码 然后 CakePHP 应该返回经过验证的 JSON
  • 展开可选 IBOutlet 值时为 Nil

    我有一个fatal error unexpectedly found nil while unwrapping an Optional value for an IBOutlet 在我的自定义视图中 我已将我的插座与XIB文件 我已经仔细检
  • 在 Objective-C 中打乱 NSString 中的字母

    我写了这个函数 它会打乱 a 的内容NSString 它似乎可以工作 但时不时会崩溃 这可能是一种迂回的方式 但我将字符放入一个数组中 随机交换数组中的元素 然后将数组转回字符串 我不确定我正在做的事情是不安全的 这会导致它崩溃 我想这可能
  • 从视图控制器返回到表视图控制器时,表视图单元格“跳转”

    我有一个TableViewController 然后单击自定义单元格会将您带到相关的WebViewController 我遇到的问题是 当我点击 返回 时WebViewController中的表视图单元格TableViewControlle
  • pandoc 文档转换失败,错误 2

    当我在 R studio 中编写 HTML 时 我得到以下结果 C Users Susan ANACON 1 Scripts pandoc RTS K512m RTS Lesson3 student utf8 md to html from
  • Ruby:KML 库?

    我正在寻找一个 ruby 库来将位置数据导出到 KML 文件中 要导出的数据主要包含带有纬度和经度的简单点 但我也希望能够导出更复杂的多边形 I tried 龟豹 http rubygems org gems kamelopard 但觉得不
  • Python __dict__

    属性 dict 应该包含用户定义的属性 但是如果我们打印 dict 一个空的类 我还会得到 module dict weakref doc 哪些是由 Python 预先填充的 dict 相应于类对象类型的属性 Now base and cl
  • 主 NSWindow 阴影不会像子窗口那样改变

    我的应用程序中的主窗口是无边框的 self window setStyleMask NSBorderlessWindowMask 从该窗口 我还打开其他子窗口 当我在其他子窗口之间单击时 我看到当该子窗口被单击并成为焦点窗口时 这些子窗口的
  • 如何使嵌套双引号在 bash 解释器中幸存下来?

    鉴于下面的上下文 是否存在任何可以插入到 WGETOPT 定义中的神奇语法 以允许 吸收 USERAGENT 变量 并且仍然允许调用 wget 命令 如下所示syntax 1 我目前已经求助于使用 eval 但我对此并不满意 但也许这是我可
  • 根据 React.Js 中第一个下拉列表中的选择填充第二个下拉列表

    我正在学习反应并努力根据从第一个下拉列表中单击的选项来填充第二个下拉列表 我在下面包含了我的代码 我认为问题在于我尝试设置的位置this state selected param tableName 我认为这行不通 但我不知道该用什么来代替
  • SVG 作为 CSS 背景 - 有没有办法重复 x 且中间没有空格?

    在基于 Webkit 和 Blink 的浏览器中 SVG 无法正确平铺 不同缩放级别的图像之间存在间隙 StackOverflow 上有许多主题解决了这个问题 所有主题都标记为已解决 但这些人一定没有足够彻底地测试他们的解决方案 我的 SV
  • Groovy Abstract ConcurrentMap 中的错误?

    抽象ConcurrentMap http grepcode sadcom file repo1 maven org maven2 org codehaus groovy groovy all 2 4 3 org codehaus groov