- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个相当复杂的项目,它大量使用 Java 的多线程。在回答我之前的一个问题时,我描述了一个丑陋的 hack,它应该克服并行迭代 Java 的 ConcurrentHashMap 的固有缺陷。虽然它有效,但我不喜欢丑陋的黑客,并且在尝试在实际系统中引入建议的概念验证时遇到了很多麻烦。在尝试寻找替代解决方案时,我遇到了 Scala 的 ParHashMap,它声称实现了 foreach 方法,该方法似乎是并行操作的。在我开始学习一门新语言来实现一项功能之前,我想问以下问题:
1) Scala 的 ParHashMap
的 foreach
方法是否可扩展?
2) 从 Scala 调用 Java 代码是否简单直接?反之亦然?我只是提醒一下,代码是并发的并且使用泛型。
3)将部分代码库切换到 Scala 是否会导致性能损失?
作为引用,这是我之前关于 ConcurrentHashMap 并行迭代的问题:
Scalable way to access every element of ConcurrentHashMap<Element, Boolean> exactly once
编辑
我已经用可能非常不惯用的 Scala 实现了概念验证,但它工作得很好。 AFAIK 鉴于其标准库和任何可用的第三方库的当前状态,不可能在 Java 中实现相应的解决方案。
import scala.collection.parallel.mutable.ParHashMap
class Node(value: Int, id: Int){
var v = value
var i = id
override def toString(): String = v toString
}
object testParHashMap{
def visit(entry: Tuple2[Int, Node]){
entry._2.v += 1
}
def main(args: Array[String]){
val hm = new ParHashMap[Int, Node]()
for (i <- 1 to 10){
var node = new Node(0, i)
hm.put(node.i, node)
}
println("========== BEFORE ==========")
hm.foreach{println}
hm.foreach{visit}
println("========== AFTER ==========")
hm.foreach{println}
}
}
最佳答案
我对此提出一些警告:
par
内容 here 。 如果您仍然关心我要说的话,请继续阅读。
首先,这是一个学术paper描述并行集合如何工作。
回答你的问题。
1) 在多线程方面,Scala 比 Java 更轻松。这些抽象真是太棒了。从 par
调用获得的 ParHashMap
会将工作分配给多个线程。如果没有更好地了解您的机器、配置和用例,我无法说明这将如何为您扩展,但如果做得正确(特别是在副作用方面),它将至少与 Java 实现一样好。但是,您可能还想查看 Akka对一切有更多的控制权。听起来这可能比简单的 ParHashMap
更适合您的用例。
2) 使用 JavaConverters
以及 asJava
和 asScala
方法在 Java 和 Scala 集合之间进行转换通常很简单。我建议确保您的方法调用的公共(public) API“看起来像 Java”,因为 Java 是最不常见的标准。此外,在这种情况下,Scala 是一个实现细节,无论如何你都不想泄露这些细节。因此,请将抽象保持在 Java 级别。
3) 我猜想 Scala 在运行时实际上会带来性能提升。但是,您会发现编译时间要慢得多(可以解决。ish)。此堆栈溢出post Scala 作者的著作很老,但仍然有意义。
希望有帮助。这是一个很大的问题。
关于java - Java的项目中使用scala的ParHashMap代替ConcurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20164690/
我最初构造了一系列嵌套的 ConcurrentHashMaps private final ConcurrentHashMap allInOne = new ConcurrentHashMap
我正在尝试使用 ConcurrentHashMap 初始化 ConcurrentHashMap private final ConcurrentHashMap > myMulitiConcurrent
为了提高工作效率,我尝试将数据保存在一个动态容器中。 我在 class 中初始化它与 private final ConcurrentHashMap allInOne = new Concur
我正在创建基于 Socket 的服务器-客户端预订服务,并且遇到有关将由多个线程访问的类的问题,是否需要扩展 ConcurrentHashMap 或创建变量 ConcurrentHashMap 是否足
从 Javadoc 我知道 ConcurrentHashMap.replace 是原子的,但是 ConcurrentHashMap.put 呢?我看到它们在源代码中的实现方式不同,但我无法弄清楚它们的
是 ConcurrentHashMap.get() 保证看到以前的ConcurrentHashMap.put()通过不同的线程?我的期望是,阅读 JavaDocs 似乎表明了这一点,但我 99% 确信
使用 ConcurrentHashMap,我发现 computeIfAbsent 比 putIfAbsent 慢两倍。这里是简单的测试: import java.util.ArrayList; imp
我有一个以下格式的 ConcurrentHashMap: ConcurrentHashMap> 现在在此 map 中,我想删除数组列表中的特定值。任何人都可以指导这一点。 编辑1:我有一张 map >
为什么 ConcurrentHashMap.Segment 和 ConcurrentHashMap.HashEntry 类是静态的?为什么要这样设计? 最佳答案 基本上所有不需要使用其封闭类属性的内部
在 ConcurrentHashMap 中通过键递增并发计数器时,使用常规 Int 作为值是否安全,还是我们必须使用 AtomicInteger?例如考虑以下两个实现 ConcurrentHashMa
我对java中的并发数据结构有疑问,特别是: 1) ConcurrentHashMap 2) HashMap 3) ConcurrentHashMap 如果我理解正确的话: 1) 读/写是线程安全的,
我正在尝试查看实际的 Java 文档,描述传递给 ConcurrentHashMap.computeIfAbsent 和 ConcurrentHashMap.computeIfPresent< 时可以
我有一个名为 SerializableL 的接口(interface)由 3 个不同的类实现: 产品 横幅 标签 我开始重构,想用多个方法调用替换多个段落。 public void load(Conc
一 JDK 中的 ConcurrentHashMap 在 JDK 8以前,HashMap 是基于数组 + 链表来实现的。整体上看,HashMap 是一个数组,但每个数组元素又是一张链表。 当向 Has
我想知道当我们在调整大小时尝试读取 ConcurrentHashMap 时可能发生的情况。 我知道在读取期间,第一次尝试总是不同步的。在第二次尝试中,它将尝试获取锁并重试。 但是,如果它在调整大小时发
在一个应用程序中,1 个线程负责不断更新映射,主线程定期读取映射,使用 ConcurrentHashmap 是否足够?或者我应该明确地锁定同步块(synchronized block)中的操作吗?任何
介绍 ConcurrentHashMap 技术是为了解决问题而生的,ConcurrentHashMap 解决了多个线程同时操作一个 HashMap 时,可能出现的内部问题。当多个线程同时操作一
我有一个由多个线程访问的键值映射: private final ConcurrentMap key_vval_map = new ConcurrentHashMap(); 我的自定义 get() 和
谁能告诉我这段代码出了什么问题?我要拔头发了! 如果我使用 HashMap 而不是 ConcurrentHashMap 则没有任何问题。代码使用JDK 5.0编译 public class MapTe
来自 ConcurrentHashMap 的源码 /** 171 * Number of unsynchronized retries in size and containsVal
我是一名优秀的程序员,十分优秀!