3

スレッドを開始すると、発生する前の関係に特別な影響があることをどこかで読みました。今、私のコードが過去の関係を保証しているかどうかわからないので、教えてください。

Dispatcher スレッドと、Runnableインターフェイスを実装する Worker クラスがあります。Dispatcher スレッドは Worker の新しいインスタンスを作成しLinkedList、メソッドを介して Worker インスタンスaddに要素を入力します。

次に、Dispatcher はメソッドExecutorServiceを介してWorker インスタンスをに渡します。execute

次に、Worker クラスの run メソッドが .xml ファイルへのアクセスと削除を開始しLinkedListます。

Worker の新たに開始されたインスタンスはLinkedList、Dispatcher が残したのと同じ状態を認識しますか? LinkedListそれとも、何らかの矛盾した状態にある可能性がありますか? LinkedList同期化されたメソッドに入力する必要がありますか?

4

3 に答える 3

4

ドキュメントによると:ExecuterService javadocs

メモリの一貫性の影響:RunnableまたはCallableタスクをExecutorServiceに送信する前のスレッド内のアクションは、そのタスクによって実行されるアクションの前に発生します。アクションは、Future.get()を介して結果が取得される前に発生します。

これはあなたのコンセプトが正しいことを意味します。

于 2011-10-04T17:06:13.787 に答える
2

Java言語仕様は次のように書いています

スレッドを開始するアクションは、スレッド内の最初のアクションと同期します。

アクションが次のアクションx と同期する場合は、yもありますhb(x, y)

2つのアクションxとが存在する場合、それが発生することを示すyために書き込みます-beforehb(x, y)x y

ただし、エグゼキュータについて話しているので、あなたの説明から、それがあなたのケースに関連するかどうかは明らかではありませんが、そのエグゼキュータがいつ作成されるか、またはそのワーカースレッドが開始されるかについては説明しません。

関連するのは、ExecutorのJavaDocからの次の抜粋です。

Runnableメモリの一貫性の影響:オブジェクトをExecutor 発生させる前のスレッドでのアクション-実行が開始される前、おそらく別のスレッドで。

したがって、ディスパッチャスレッドがを送信した後にリストにアクセスしなくなる限り、コードは安全Runnableです。

于 2011-10-04T17:09:28.550 に答える
1

ロックまたはその他の同期プリミティブが使用されていて、単純な古い ArrayList を使用しているだけの場合、2 つのスレッドは異なる状態になる可能性があります。

2 つの個別のスレッド間で作業を調整する場合は、スレッド セーフ/並行データ構造を使用するか、同期コードを使用して、スレッド間の一貫した "メモリ スナップショット" を保証する必要があります。

これが重要な理由の 1 つは、キャッシングによるものです。異なるプロセッサで同時に実行されている 2 つのスレッドは、いくつかのオブジェクトを異なるローカル レジスタ (これらのプロセッサに対してローカル) にキャッシュしている可能性があります。

于 2011-10-04T16:44:53.860 に答える