代码之家  ›  专栏  ›  技术社区  ›  Ashwin

如何同步插入/删除数据结构中的元素,函数方式?

  •  0
  • Ashwin  · 技术社区  · 6 年前

    MinHeap removeElement() addElement() 如果没有使状态成为线程安全的,则会产生不一致的状态(因为它们涉及增加/减少currentHeapSize)。


    编辑#1

    我的用例是,我将获得一个数据流,并不断地将其添加到堆中。当有人请求数据时,会返回min堆的根。所以这里插入发生得很快。为每个插入创建一个新堆不是很昂贵吗?我想会的。如果是这样的话,函数式编程到底有什么帮助呢?这仅仅是一个理论概念,还是也有实际意义?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Alexei Kaigorodov    6 年前

    并行访问同一数据结构的问题是双重的。首先,我们需要序列化并行更新。@蒂姆对此给出了全面的回答。第二,如果有很多读者,我们可以让他们阅读与写作并行。在这种情况下,不变性发挥了作用。没有它,作家只能等待读者完成。

        2
  •  1
  •   Tim    6 年前

    没有一种真正的“功能性”方法可以让数据结构由多个线程更新。事实上,函数式编程在多线程环境中如此出色的一个原因是没有任何这样的共享数据结构。

    然而,在现实世界中,这个问题经常出现,因此您需要某种方法来序列化对共享数据结构的访问。最简陋的方法就是在整个代码上加一个大锁,只允许一个线程同时运行(例如使用互斥锁)。有了巧妙的设计,这可以使合理的效率,但它可能很难得到正确的和复杂的维护。

    Actor 然后接收读取或修改数据结构的请求。Akka框架将确保一次只处理一条消息。

        3
  •  0
  •   Mikhail Nemenko    6 年前

    https://typelevel.org/cats-effect/concurrency/ref.html 但它是原子引用实现,或者写一些java.util.concurent文件.ConcurentHashMap包装器