マルチスレッド コードで同期を使用する本当の理由を理解しようとしています。
複数のスレッドが共通の共有リソースに同時にアクセスすると、デッドロックや競合状態などの多くの問題が発生することがわかっていますが、複数のスレッドによって呼び出されるコードを同期すると、1 つのスレッドのみがリソースにアクセスできるようになります。他のスレッドはキューで待機します。この場合、これは同期のないシングル スレッド アプリケーションと同じです。マルチスレッド コードを同期すると、どのようなパフォーマンスが得られるでしょうか?
2 つのシナリオを比較するための単なる例 1. 1 つのレコードを処理するのに 1 秒かかると仮定して、1 つのスレッド モデルで 1000 のレコードを処理する必要があるため、合計で 1000 秒かかります。2. マルチスレッド モデルで 1000 レコードを処理する必要があります。プロセス メソッドは同期されます。1 つのレコードを処理するのに 1 秒かかると仮定し、10 スレッドが生成されると仮定します。したがって、ここでも、スレッドが同期にアクセスするたびにメソッド、残りのスレッドはキューに入れられ、完了するまでに合計で 1000 秒かかります。
誰かがこの基本を理解してくれたら、私は本当に満足し、安心します. ありがとう、
編集:
プログラミング言語については触れていません: その Java
以下のコードの同期の影響と同期なしの影響を理解するためだけに (Spring Batch の例):
package com.dbas.core;
import java.util.List;
import org.springframework.batch.item.ItemReader;
public class NextReader implements ItemReader<String> {
private List<String> itemList;
public NextReader(ListBean listBean) {
itemList = listBean.getItemList();
}
public synchronized String read()
{
if (!itemList.isEmpty()) {
return itemList.remove(0);
}
return null;
}
}
上記のコードを同期する必要がありますか? そうでない場合、インスタンス変数「itemList」は複数のスレッドで共有されます。共有されている場合、上記のアイテムの取得は正しく機能しますか? アイテムを処理する read() の後に呼び出されるプロセッサがあります。複数のスレッドに対して上記のコードを同期することはお勧めですか、それとも同期しなくても問題なく動作しますか?
ありがとう。