0

ファイル内の各行が解析されるときに、GPAR 非同期関数を使用してプロセスを起動しています。

スレッド セーフに問題があるのではないかと思わせる奇妙な動作が見られます。

次のように、入力スプレッドシートの現在の行から値をロードしている現在のオブジェクトがあるとします。

Uploader {
  MyRowObject currentRowObject
}

現在の行のすべての値を取得したら、次のような async クロージャーを起動します。

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 に答える