问题标签 [concurrentskiplistmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
75 浏览

java - ConcurrentSkipListMap 如何正确使用

我在我的代码中使用 ConcurrentSkipListMap 并且我想确保方法是并发安全的。

我知道地图会自动执行containsKey()get等等。但并不意味着整个块不能被两个线程同时访问,而是至少在行与行之间保护了happens-before关系(第一个线程到达该行将首先退出该行)。但是,那么如何实际使用这些方法来获得可组合且一致的结果呢?如何锁定这些行?

如何在不影响输出数据一致性的情况下锁定以获得最精细的粒度?

0 投票
3 回答
388 浏览

java - 我可以使用 identityHashCode 在尊重相同性的对象之间生成 compareTo 吗?

我想在两个对象之间实现一个简单的比较器,其唯一要求是

  1. 它是一个有效的比较器(即定义所有对象的线性顺序)和
  2. .compare当且仅当对象相同时才会返回 0 。

Comparator.comparing(System::identityHashCode)工作吗?还有其他方法吗?

动机: 我想构建一个集合,允许我将带时间戳的消息存储在线程安全集合中,该集合将支持诸如“获取时间戳位于 [a,b) 中的所有消息”之类的查询。

似乎番石榴TreeMultimap使用了全局锁(编辑:如果用synchronizedSortedSetMultimap包装器包装),并且ConcurrentSkipListMap似乎每次只支持一个条目(它是一个映射,而不是一个多映射)。所以我想只使用一组对:

ConcurrentSkipListSet<ImmutablePair<Float,Message>> db,

其中对是按词法排序的,首先是时间(使用Float.compareTo),然后是类似的东西Comparator.nullsFirst(Comparator.comparing(System::identityHashCode))

  • nullsFirst就是这样db.subSet(ImmutablePair.of(a,null), ImmutablePair.of(b,null))查询半开时间间隔[a,b)。

  • 你明白为什么我关心比较器保持相同性:如果消息比较器为不同的消息返回零,则可能会删除消息。

  • 你也明白了为什么我不需要比较器的其他东西:它就在那里,所以我可以使用ConcurrentSkipListSet. 我当然不想强加给用户(好吧,只是我 :-) 为Message.

  • 另一种可能的解决方案是使用ConcurrentSkipListMap<Float, Set<Message>>(带有线程安全的 Set<> 实例),但在内存方面似乎有点浪费,一旦删除消息,我将需要自己删除 emptySet 以节省内存。

编辑:正如几个人所指出的,identityHashCode 可能会产生冲突,事实上我现在已经确认我的设置中存在这种冲突(这大致相当于上面有 4K 集合,每个集合每个时间箱都填充 4K 消息)。这很可能是我看到一些消息被丢弃的原因。所以我现在比以往任何时候都更有兴趣找到某种方式来拥有一个真正尊重相同性的“不可知”比较运算符。实际上,一个 64 位哈希值(而不是 identityHashCode 提供的 32 位值)可能就足够了。

0 投票
1 回答
88 浏览

java - 与 ConcurrentSkipListSet 一起正常工作的动态比较器

我正在尝试使用

queue = new ConcurrentSkipListSet<Task>(Comparators.comparing(Task::priority))

作为具有唯一元素的并发优先级队列(请参阅此处的类似讨论),但我需要不时更改任务的优先级。

显然,改变元素在集合中的优先级就像打开一罐蠕虫;幸运的是,我只需要在将它们从queue中删除之后以及重新提交它们之前更改它们的优先级。更准确地说,我用来pollFirst()从 中弹出一个元素queue,我可能需要在更新其优先级(具有较低优先级)后重新提交。

如果这是一个串行实现,那么在元素位于集合之外时更改元素的优先级应该没有问题。

使用并发访问进行此更新的线程安全方式是什么? 是否足以保证

task = queue.pollFirst()以前发生过task.priorityUpdate(),以前发生过queue.add(task)

0 投票
0 回答
37 浏览

java - ListView(放置在片段活动下并通过 ViewPager 显示)不显示所有项目

这是第一次在这里发帖。所以我有一个在 Android 上使用 Java 创建的编剧应用程序。它有一个简单的布局,如下所示。活动布局

因此,当用户单击“写入”时,他们将能够使用纯文本编写剧本,但要遵循称为 Fountain 的特定语法。下面给出一个例子。

如果用户编写以下文本...

作家(微笑)我必须这样做。

该应用程序会将文本拆分为行,并将不同的行添加到列表字符串(listy)中,然后从那里,当用户单击阅读选项卡时,应用程序将从 listy 的位置 0 开始并检查该项目是否为场景标题、动作或对话,它会根据它来格式化文本。动作和场景标题重力是“左”,而对话重力是“中心”。

一切正常,我没有收到任何错误。然而,问题只有一个。

当用户点击阅读时,应用程序会显示如下所示的脚本。

这是用户写的。

这是用户在格式化剧本后看到的。

问题是格式化后,列表视图不显示所有项目。就像我上面提到的,我将纯文本分成单独的行,并将它们添加到 ListString(listy),然后在确定 ListString(listy) 中的项目是否是动作、对话或场景标题之后,我创建带有键“type”和“content”的地图,type 是场景标题、对话或动作,content 是 ListString(listy) 中的项目。

然后我将地图添加到 ListMap(fountain) 并将其设置为 listview 数据。

我遇到的问题是列表视图没有显示所有项目。当我滚动时,有些项目变得可见,而有些则不可见。并且侧面的滚动条不动,它停留在顶部,就好像我根本没有滚动一样。

起初我以为是我的手机(Samsung J7 Neo),但我也在三星 S10+ 上测试了该应用程序,但问题仍然存在。

请帮帮我。可能是什么问题呢?

注意:我使用 Sketchware 来开发我的应用程序,而不是 Android Studio。

这是片段的 XML 代码。

这是 ReadScriptFragmentActivity.java

请帮忙。我不确定问题可能是什么。我不是开发人员。我通过 Sketchware 学习了 Java。所以请耐心等待我。先感谢您。

编辑:我发现了问题。如果您查看 ListView onBindCustomView,我添加了三个 if 语句来检查项目是对话、场景标题还是动作。问题是我为它们中的每一个添加了单独的 if 语句。所以我所做的就是将它们放在一个 if-else 语句中,例如如果项目是场景,则格式化为场景,否则如果项目是动作,则格式化为动作,否则如果项目是对话,则格式化为对话。所以简而言之,我将其他 if 语句放在前一个 if 语句的“else”部分下。(对不起,如果我的英语不好)。这是新的更新代码。公共类 ReadscriptFragmentActivity 扩展片段 {

}

感谢那些回复的人。我想这个问题现在已经回答了。干杯。

0 投票
1 回答
65 浏览

java - ConcurrentSkipListMap firstKey() 会抛出 NoSuchElementException,即使它包含数据

我编写了一个从 Web 套接字接收数据的小应用程序,我将其存储在静态 ConcurrentSkipListMap 中。应用程序最初创建一个新线程,它在循环调用 ConcurrentSkipListMap.firstKey() 时无限运行。一段时间后,即使 ConcurrentSkipListMap 包含数据,此调用也会引发 NoSuchElementException。 catch 块中的断点 我的应用程序示例:

我有包含 websocket 实现和 NavigableMap init 的缓存器类:

然后无限循环:

和分析器类:

静态数据模型:

主类例如运行:

该示例仅显示了应用程序的组成方式,但我无法使用它来引发错误,但我将我的 repo 公开: https ://github.com/Sick-E/TrioBot

谁能帮帮我吗?谢谢你。托马斯