今日の世界では、あらゆるものが急速に発展しています。あらゆる点で常に改善の余地があります。私たちのプログラミング言語も同様です。今日、最新のテクノロジーにより、私たちは物事が簡単かつ迅速に実行されることを期待しています。複数のことを同時に実行するために、同時実行性の概念が生まれました。では、同時実行性とは何ですか、その使用方法、これが必要な理由などは何でしょうか?この記事ではそのような質問に触れ、個別に回答していきます。そこで、非常に基本的な共通セクションである同時実行性の定義に議論を移しましょう。このトピックでは、Java における同時実行性について学びます。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
では、同時実行性とは実際には何でしょうか?これに答えるために、一般的なシナリオを考えてみましょう。この記事を読んでいるときに、複数のことを同時に実行しようとしているとします。メモを取ろうとしているかもしれないし、それを理解しようとしていたり、何か考えているのかもしれません。簡単に言えば、複数のことを並行して実行しようとしているということです。これが同時実行性の意味です。同時実行とは、単に複数のタスクを相互に並行して実行することです。この記事では、プログラミング言語としての Java の範囲で並行性について説明します。
一方で、スレッドの基本的な定義を考えてみましょう。実際、Java または一般的に、どのプログラミング言語でも、これは同時実行性を担うスレッドです。これらのスレッドの基本的な役割は、タスクの並列実行を容易にすることです。
スレッドは、独自の呼び出しスタックを持つ軽量プロセスです。ただし、スレッドは、同じプロセスで実行されている他のスレッドから共有データにアクセスできます。 Java アプリケーション内で多くのスレッドを使用して、並列処理または同時実行を実現できます。
さて、次のトピックに移りましょう。それは…
つまり、すべての OOP 言語には、Java や C# などの他のプログラミング言語のスレッド概念があります。 Java では、同時実行性を実現するために異なるスレッドを作成して実行するさまざまなプロセスがあります。
この簡単な定義の後、次の新しいトピックについて説明します。
Java アプリケーションを並行させるために必要な最初のクラスは、java.lang.Thread クラスです。 Java.lang.Thread クラスは、Java プログラミング言語のすべての同時実行概念を担当します。この後、スレッドの動作をスレッド クラスから抽象化する java.lang.Runnable インターフェイスが作成されます。
高度なアプリケーションを構築する必要があるその他のクラスは、Java 1.5 で追加された java.util.concurrent パッケージから使用されます。
それで、新たな疑問に到達しました。それは…
Java での同時実行性の実装は非常に簡単のようです。しかし、実際はそうではありません。やってみましょう。
上記の議論は一般に、同時実行性がシンプルで優れた概念であり、実装が非常に簡単であるという印象を与えます。そうですね、それをより良く監視し、理解しようと努めるとします。その場合、基本的な概念をよく理解し、何を達成する必要があるのかを完全に理解する必要があります。
同時実行アプリケーションとシングルスレッド アプリケーションを比較してみましょう。一般に、同時アプリケーションは設計と理解に関して複雑であることがわかります。複数のスレッドによって実行されるコードには、共有データにアクセスするための特別な注意とリソースが必要です。スレッドの同期が正しくないために発生するエラーは、デバッグと修正が困難です。また、ほとんどのシナリオでは、これらのバグは初期段階では特定されません。これは本番モードで検出されますが、再現するのはさらに困難です。
バグや一般的な欠陥とは別に、同時スレッドはアプリケーションを実行するためにより多くのリソースを必要とします。
基本的に、同時実行により割り当てられる問題は 2 種類あります。これらの問題は大きく 2 つのカテゴリに分類できます
それぞれを理解しましょう。
簡単な例で理解しましょう。
カウンターまたは数値のカウントを増やすことを基本的な役割とするカウンター関数があるとします。スレッド A とスレッド B があり、スレッド A が初期値を 0 として読み取るとします。ここで、次のステップが順番に実行されます。
ここで問題が発生します。 2 つのスレッド A と B がコードを 2 回実行し、期待値は 2 ですが、1 として反映されます。これは、複数のスレッドが引き起こす可能性のある主な問題です。
これはどうすれば解決できますか?
スレッド干渉エラーは、共有変数へのアクセスを同期することで解決できます。共有データ間で更新された値との同期を維持する必要があります。
これで、2 番目のタイプのエラーを見てみましょう…
メモリ不整合エラーは通常、異なるスレッドが同じデータを読み取ろうとしたり、同じデータのビューに一貫性がない場合に発生します。これは通常、最初のスレッドが共有データを更新するときに発生します。この更新された値は 2 番目または別のスレッドには伝達されず、古いデータが読み取られます。
なぜこれが起こるのか見てみましょう。
そうですね、これには多くの原因が考えられます。通常、コンパイラはパフォーマンスを向上させるためにアプリケーションに対していくつかの最適化を行います。また、パフォーマンスを最適化するために命令シーケンスを更新する場合もあります。一般的に、プロセッサはコードの最適化も試みます。たとえば、CPU は変数の現在の値をメイン メモリではなくキャッシュ メモリまたは一時レジスタから読み取ることがあります。
同時実行性は、OOP 言語の非常に重要な機能です。スレッド化を使用すると、複数のプロセスを相互に並行して実行できます。これは、複雑なタスクをより迅速に実行するのに役立ちます。ただし、同時実行には長所もあれば短所もいくつかあります。スレッドを使用すると、リソースが大量に使用されます。
以上がJava の同時実行性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。