..
我々はより多くの関係者に公開されるその他の情報の処理タスクなどの共有データと考えることができます。 例えば、ユーロ/ドルを表す数値を格納し、想像してみてください。 我々は定期的にどのような為替レートと更新変数の値をチェックするプログラムを持っている。 一つ以上の他のプログラムは、しかし、為替レートの転換価格を操作するために更新された情報を使用します。
の管理、共有、さらにこの単純な例では、特別な注意を必要とする方法に注目してください。 アプリケーションは、変換するために為替相場を読む必要がある一方、また別のプログラム、為替レート自体を変更する要求が受信されることの例を考えてみます。
どの最初に実行される? どの為替レートの変換が行われます。 問題は、少しでも複雑ないくつかのケースでは、さらに厳しいかもしれない。
興味のある変数が基本ではないという事実を想像するが、例えば、 データの集合で構成されています。 それは今だけ部分的な書き込みを行うことが、その後書き込み終了から読書が続く可能性があります。 トランザクションは、無意味な結果を生じさせ、部分的にしか変更された値のセットで行うことが、したがって、受け入れられないでしょう。
問題のこの種の存在を考えると、多くのプログラミング言語では、 共有変数の管理のための特定のツールを提供しています。 問題のこのカテゴリは、Javaプログラミング言語、ほとんどすべての使用のいずれかで処理されるため、我々は、特に以下に検討する。
時間では、まず、より正確にしかスレッドを我々は一度にその1つのプログラムだけを確実にする方法を理解する必要がある、または(一方のスレッドが 、プロセスまたはプログラムの基本的なコンポーネントである、換言すれば、プログラムが複数のスレッドで構成することができます、共有変数にアクセスできるように)同時に実行。 私たちはこの保証を提供できるようにするメカニズムは、 相互排除と呼ばれています。
相互排除
次のような構造Variabile_Condivisaと呼ばれる(データそのものを処理するための有用な関数であるか、またはデータとメソッドのセット、)クラスの開発を想像してみてください。
パブリッククラスVariabile_Condivisa
{
euro_dollaroは浮く。
euro_sterlinaは浮く。
Variabile_Condivisa()
{
euro_dollaro = 1;
euro_sterlina = 1;
}
set_euro_dollaroボイド(e_dをフロート)= {euro_dollaro e_d;}
set_euro_sterlinaボイド(フロートe_s)= {euro_sterlina e_s;}
get_euro_dollaroフロート(){戻りeuro_dollaro;}
get_euro_sterlinaフロート(){euro_sterlinaを返す;}
}
二つの文、そして我々は複数のプログラム(または複数のスレッド間で)間で情報を共有したい為替レートユーロ/ドル、ユーロ/ポンドを表すとそのeuro_dollaro euro_sterlina、。
開発した手法は、これらのデータに値を割り当てることができます(とset_euro_dollaro set_euro_sterlina)とそれらの値(およびget_euro_dollaro get_euro_sterlina)をお読みください。
その後、我々は、変数とeuro_dollaro euro_sterlinaの値が1に設定されて設定することで、この場合の各Variabile_Condivisaの作成 、クラスのコンストラクタが実行されると呼ばれていること、および特定のメソッド(Variabile_Condivisa)を、識別する。
その後、我々は我々のプログラムで var Variabile_Condivisa(オブジェクトはプログラム内で参照することができるこのセットの特定の要素を、表現しながら、 クラスは 、共通の特性を持つエンティティのセットを表す名前付きオブジェクトの型を作成する)この方法:
Variabile_Condivisa Variabile_Condivisa VAR =新しい();我々は今varを共有データの管理に問題がないことを確認することができますように? Java言語は、パラメータとして任意のオブジェクトを受け入れるの同期キーワード (複数可)、用意されています。 同期を通しての例に示すように、あなたは、、コードのブロックを定義することができます。
同期(VAR)
{
コードの区切りの/ /同期ブロック(VAR)
}
同期化ブロック内の命令を実行する前に、任意のスレッドは変数varのロックを取得し 、またはロックが解放されるまで、コードの同じブロックになり、アクセスをブロックする、または終了するまでブロック全体を実行している中括弧によるコードの区切りの例。
言い換えれば、synchronized文(VAR)を実行する最初のスレッドは、(我々は最初の呼び出しに想像している)、実際に完了していない1日までsynchronized文(VAR)を実行するために、他のスレッドを防ぐバリアを作成します。コードの区切りの同期化ブロックの実行。 これらのブロックではその後の命令は、共有データの読み取りまたは書き込みが挿入されます。
この方法では同時に複数のスレッドが共有変数にアクセスできることを確実に相互排除を、保証されています。 それは同期にパラメータとして渡されるオブジェクトを慎重に選択する必要があること、しかし、注意する必要があります。 それは、この場合のように、例えば、あなたが読んだり編集する変数には相互排除のメカニズムを作成するすべてのスレッドに共通オブジェクトでなければなりません。
この時点で、想像すると、保留される変数varの値を読み、唯一彼らの要求に続く最初の更新後に結果を評価するスレッドように我々のプログラムを設定する。 あなたが読み込みと書き込みの間に同期メカニズムを定義する場合を考えてみましょう。
| |
Linuxの(コース)
オープンソースシステムへの完全なガイド。 49€から。 |
| |
PHP(コース)
動的なWebサイトを作成するためのフルコース。 49€から。 |
| |
RubyとRuby on Rails(コース)
RubyとRoRのと、ソフトウェアやWebアプリケーションを作成します。 39€から。 |