GPAR异步函数和传递由另一个线程更新的引用

时间:2012-11-14 23:10:18

标签: gpars

我正在使用GPAR异步函数来解析进程,因为文件中的每一行都被解析了。

我看到一些奇怪的行为让我想知道我是否遇到线程安全问题。

假设我有一个当前对象正在加载输入电子表格中当前行的值,如下所示:

Uploader {
  MyRowObject currentRowObject
}

一旦它拥有当前行的所有值,我就会触发一个看起来有点像这样的异步闭包:

Closure processCurrentRowObject = { ->
    myService.processCurrentRowObject (currentRowObject)
}.asyncFun()

它在同一个类中定义,因此它可以访问currentRowObject。

当它关闭并运行时,我解析下一行,然后创建一个新对象:

MyObject currentObject = new MyObject()

并开始用值加载它。

我认为这是安全的,异步函数将指向前一个对象。但是,我想知道是否因为我让闭包绑定到引用,如果某种方式引用在异步函数中得到更新,我将对象实例从它下面拉出来,可以这么说 - 在它尝试时更改它在前一个实例上工作。

若然,有任何修复建议吗?还是我安全吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你的情况,但是,这里有一个快速提示。 由于在线程之间共享一个可变对象总是很危险的,我建议将用于不同行的行对象完全分开:

final localRowObject = currentRowObject currentRowObject = null

Closure processCurrentRowObject = { - >     myService.processCurrentRowObject(localRowObject) } .asyncFun()