共有リソース、競合、共有アクセス - 1

「こんにちは、アミーゴ! リソースの共有についてお話したいと思います。当然、異なるスレッド間での共有です。

「私は、複数のスレッドを使用するときに発生する問題と、その解決方法について話し続けています。これは、スレッドを使用することが悪いという意味ではありません。スレッドは非常に強力なツールです。実際、スレッドを使用すると、プログラムを高速化し、均一にすることができます。」より信頼性が高くなります。プログラムが複雑になればなるほど、より多くのスレッドとさまざまな独立した部分が必要になります。」

「プログラムを独立した(疎結合の)部分に分割することは非常に有益です。」

「プログラムが内部で 100 個のスレッドに分割されていると想像してください。しかし、デュアルコア プロセッサしかありません。これは、各コアで平均 50 個のスレッドが実行されることを意味します。」

「プログラムのパフォーマンスを向上させる必要がある場合は、デュアルプロセッサ サーバーと、そのための優れたプロセッサをいくつか購入するだけです。これにより、最大 32 コアが得られ、パフォーマンスが 2 ~ 20 倍向上します。数に応じて、本当に独立した部分に分割されています。」

「これが、エンタープライズ開発において Java が主流である理由の 1 つです。企業が 20 人の開発者によって作成された複雑な内部プログラムを持っている場合、最適化によってプログラムのパフォーマンスを 2 倍にするよりも、別のサーバーを購入する方がはるかに安価です。」

ということです。

「しかし! 開発者が別のスレッドを使用することを決定するたびに、1 つの問題を解決して 2 つの問題を作成することになります。スレッドが増えても、プログラムのパフォーマンスが際限なく向上するわけではありません。」

「第一に、どんなプログラムにも、分割して異なるスレッドで並行して実行できない作業があります。第二に、すべてのスレッドは同じプロセッサ上で実行されます。スレッドが増えるほど、それぞれの動作が遅くなります。」

「そして最も重要なことは、スレッドは同じオブジェクト (通常は「共有リソース」と呼ばれます) を使用することが多いということです。」

「たとえば、スレッドは完了した作業に関する情報をファイルに保存したいと考えています。そのようなスレッドが複数あり、同じファイルに情報を書き込みたい場合、それらのスレッドは互いに干渉します。ファイルがファイルに保存されるのを防ぐには、ごちゃ混ぜになっているため、ファイルへのアクセスは制限されています。つまり、1 つのスレッドがファイルを使用している間、他のスレッドは待機しています。」

「はい、覚えています。同期キーワードを使用してそれを行います。」

「まさにその通りです。」

「そして、スレッドが異なるファイルに書き込んでいる場合はどうなるでしょうか?」

「形式的には、これらは別のオブジェクトですが、おそらく同じハードドライブ上にあるでしょう。」

「では、プロセッサ内で何かを並列化することは本当に可能でしょうか?」

「技術的にはその通りですが、スレッドが持っているデータ以外に何かが必要になると、その何かがすでに別のスレッドによって占有されている可能性があり、スレッドは待たなければなりません。」

「それではどうすればいいでしょうか? スレッドをたくさん立てるべきかどうかはどうすればわかりますか?」

「これは、プログラムのアーキテクチャによって直接決まります。すべてのプロジェクトには、プログラムで使用されるすべての『リソース』を知っており、その限界と、それらがどの程度並列化されているかを知っている独自の『アーキテクト』がいます。」

「それで、私が知らなかったら?」

「選択肢は 2 つあります。」

a)誰かの監督の下で働くこと

b)いくつかのしこりを自分で理解する

「私はロボットです。しこりはできません。できるのはへこみだけです。」

「それでは、ちょっと凹んでください。」

「なるほど。ありがとうございます。私が疑問に思っていたことがいくつか分かりました。」