我正在使用GPAR异步函数来解析进程,因为文件中的每一行都被解析了。
我看到一些奇怪的行为让我想知道我是否遇到线程安全问题。
假设我有一个当前对象正在加载输入电子表格中当前行的值,如下所示:
Uploader {
MyRowObject currentRowObject
}
一旦它拥有当前行的所有值,我就会触发一个看起来有点像这样的异步闭包:
Closure processCurrentRowObject = { ->
myService.processCurrentRowObject (currentRowObject)
}.asyncFun()
它在同一个类中定义,因此它可以访问currentRowObject。
当它关闭并运行时,我解析下一行,然后创建一个新对象:
MyObject currentObject = new MyObject()
并开始用值加载它。
我认为这是安全的,异步函数将指向前一个对象。但是,我想知道是否因为我让闭包绑定到引用,如果某种方式引用在异步函数中得到更新,我将对象实例从它下面拉出来,可以这么说 - 在它尝试时更改它在前一个实例上工作。
若然,有任何修复建议吗?还是我安全吗?
谢谢!
答案 0 :(得分:1)
我不确定我是否完全理解你的情况,但是,这里有一个快速提示。 由于在线程之间共享一个可变对象总是很危险的,我建议将用于不同行的行对象完全分开:
final localRowObject = currentRowObject currentRowObject = null
Closure processCurrentRowObject = { - > myService.processCurrentRowObject(localRowObject) } .asyncFun()