gpt4 book ai didi

Java:函数式编程中线程之间的状态共享

转载 作者:行者123 更新时间:2023-12-02 15:20:49 25 4
gpt4 key购买 nike

我的问题是这个问题的更具体的实例:Functional programming: state vs. reassignment

我是 FP 的新手,正在尝试通过 Java 来理解它。

我有以下类,其对象在多个线程之间共享:

public class Bank
{
private double[] accounts = new double[1000];

public synchronized void transfer(int from, int to, double amount)
{
account[from] -= amount;
account[to] += amount;
}
}

(这是一个非常简化的示例,因此省略了验证和条件等待等其他细节)。

由于“transfer”方法是同步的,即使与多个线程共享,Bank 对象的可变状态也不会被破坏。如果我想通过 Java 中的 FP 实现同样的事情,我该如何编写该代码? (我想看一个实际的代码示例)。

编辑:我对 FP 的兴趣源于它编写线程安全的并发应用程序的潜力。以下是声称拥有该内容的文章的链接:http://www.defmacro.org/ramblings/fp.html

EDIT2:刚刚发现了 Java 的 STM。不确定它的性能,但它似乎提供了我想要的。 http://multiverse.codehaus.org/60second.html

最佳答案

有很多方法可以以更实用的方式处理共享、同步的状态变量。

交易变量

这里的经典方法是使用事务内存:

程序中恰好有一个共享状态变量,支持冲突写入时的回滚。在 Haskell 中,这将通过 STM monad(仅通过事务变量支持状态的 monad)中的 TVar(事务变量)来表示。

这里使用STM的好处是可以保证避免死锁(尽管活锁仍然是可能的)。

内存变量

您还可以使用更传统的方法,例如 MVar。这些是充当锁的可变变量:

  • 它们仅包含一个值
  • 该值可以被删除或放入变量中
  • 如果线程尝试写入完整的 MVar,它会阻塞
  • 如果线程尝试从空的 MVar 中读取数据,它会被阻塞

通过这种方式,您可以支持线程自动更新共享值。

我会选择 STM 解决方案,因为这是最惯用的。

关于Java:函数式编程中线程之间的状态共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com