【发布时间】:2012-05-10 18:26:24
【问题描述】:
我的问题是这个问题的更具体的实例化: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
【问题讨论】:
-
“我是 FP 的新手,并试图通过 Java 来理解它”这不是一个好主意。试试这个book.realworldhaskell.org
-
我看不出线程安全和函数式编程之间的联系。您是否声称使用 FP 会否定同步的需要以实现线程安全?
-
@David Harkness 是的。使用 FP 的原因之一是,由于使用不可变状态的范例,不需要同步对状态的访问,因此 FP 本质上是线程安全且高效的(因为不涉及同步成本);因此特别推荐用于多核 cpu 的编程。会找到并引用参考文献。
-
@David Harknes pl。请参阅本文的“并发”部分:defmacro.org/ramblings/fp.html
-
@shrini1000 - 使用不可变对象使其成为线程安全的。您也可以使用非 FP 代码执行此操作。但是,您的示例有一个共享的
Bank实例,其中包含可变数据。
标签: java functional-programming mutable