0

在解析文件中的每一行时,我正在使用 GPAR 异步函数来触发进程。

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

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

Uploader {
  MyRowObject currentRowObject
}

一旦它具有当前行中的所有值,我就会启动一个看起来有点像这样的异步闭包:

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

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

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

MyObject currentObject = new MyObject()

并开始用值加载它。

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

如果是这样,有什么修复建议吗?还是我安全?

谢谢!

4

1 回答 1

1

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

最终 localRowObject = currentRowObject currentRowObject = null

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

于 2012-11-15T09:49:36.053 回答