「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > マルチスレッド化 : エンジニアのための重要な概念 - パート 1

マルチスレッド化 : エンジニアのための重要な概念 - パート 1

2024 年 11 月 8 日に公開
ブラウズ:428

Multithreading : Key Concepts for Engineers - Part 1

主要なマルチスレッドの概念を理解することは、スキルセットを強化するだけでなく、アプリケーション開発、スケーラビリティ、およびソフトウェア ソリューション全体の品質に直接影響を与えるため、ソフトウェア開発者にとって非常に重要です。

原子性

マルチスレッドのコンテキストでは、アトミック操作により、スレッドが他のスレッドから中断されることなく一連のアクションを実行できることが保証されます。複数のスレッドが共有データの読み取りまたは書き込みを同時に試行する場合があります。アトミック性がないと、同時に変更を行うと、一般に競合状態として知られる、一貫性のない結果や予期しない結果が生じる可能性があります。

Java 仕様では、「読み取り」と「書き込み」がそれらの組み合わせではなくアトミックな操作であることが保証されています。そのため、「読み取り、1 を加算し、その結果を書き戻す」操作は仕様に従ってアトミックではありません。このような操作は複合操作と呼ばれ、コードでの使用のコンテキストでは通常はアトミックである必要があります。

アトミック操作の例:

  1. カウンタのインクリメント: 2 つのスレッドがアトミック性なしで同時にカウンタをインクリメントすると、両方とも同じ値を読み取り、同じインクリメントされた値を書き戻す可能性があり、1 つのスレッドが失われる可能性があります。インクリメント。

  2. 共有変数の更新: あるスレッドが値を読み取り、別のスレッドがその値を変更している場合、原子性がなければ、読み取りスレッドは矛盾した値を取得する可能性があります。

原子性の達成:

  • アトミック クラス: 多くのプログラミング言語は、アトミックであることが保証されている操作をカプセル化するアトミック クラス (AtomicIntegerin Java など) を提供します。

  • 同期メソッド/ブロック: Java などの言語では、synchronized キーワードを使用して、一度に 1 つのスレッドのみがコード ブロックまたはメソッドを実行できるようにすることができます。

  • ロック: 明示的なロック (ReentrantLockin Java など) を使用して、共有リソースへのアクセスを管理します。

利点

  • パフォーマンス: java.util.concurrent.atomic のクラスは、スレッドの安全性を確保するためのロックフリーのアプローチも提供しており、多くのシナリオで推奨される選択肢となっています。
  • 単純さ: アトミック クラスを使用すると、開発者がロックを管理する必要がなくなり、プログラムのロジックに集中できるため、コードが簡素化されます。
  • スレッドの安全性: アトミック操作により、データ破損や競合状態のリスクなしに、変数が複数のスレッド間で安全に更新されることが保証されます。

不変性

不変性とは、作成後に状態を変更できないオブジェクトのプロパティを指します。プログラミングにおいて、不変オブジェクトとは、一度初期化されると変更または変更できないオブジェクトのことです。不変オブジェクトを変更する代わりに、必要な変更を加えた新しいオブジェクトが作成されます。

不変とは、オブジェクトのコンストラクターが実行を完了すると、そのインスタンスを変更できないことを意味します。

不変オブジェクトの特性

  • 状態変更なし: 不変オブジェクトが作成されると、その状態 (属性またはフィールド) は存続期間を通じて一定のままになります。

  • スレッドセーフ: 不変オブジェクトは変更できないため、同期を必要とせずに複数のスレッド間で安全に共有できます。

  • ハッシュコードの安定性: 不変オブジェクトのハッシュコードは、存続期間を通じて同じままであるため、HashMap や HashSet などのハッシュベースのコレクションでの使用に適しています。

不変性の達成:

  • レコードの使用 (Java 14 ): Java では、レコード機能により、不変データ クラスを作成する簡潔な方法が提供されます。
public record ImmutablePoint(int x, int y) {}
  • 不変のデータ構造を使用する: プログラミング言語またはライブラリによって提供される既存の不変のデータ構造を利用します。たとえば、
  1. Java: Collections.unmodifiableList()、List.of()、Set.of()

  2. C#: System.Collections.Immutable の ImmutableList、ImmutableArray

  3. Python: タプルは本質的に不変です。

  • Use Final Fields: クラスのフィールドを Final として宣言します。これにより、オブジェクトの構築中にフィールドを 1 回だけ割り当てることができるようになります。

  • No Setters: 可変フィールドにはセッター メソッドを提供しないでください。これにより、オブジェクトの構築後に外部コードがオブジェクトの状態を変更するのを防ぎます。

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  • 静的ファクトリ メソッド: パブリック コンストラクターを提供する代わりに、オブジェクトの新しいインスタンスを返す静的ファクトリ メソッドを使用して、状態を変更できないことを明確にします

  • ビルダー パターン (複雑なオブジェクトの場合): 多くのパラメーターを必要とするオブジェクトの場合は、ビルダー パターンを使用して不変オブジェクトを作成します。ビルダーはパラメータを蓄積し、最後に不変のインスタンスを構築します。

利点

  • Concurrency: 不変オブジェクトの内部構造が有効であれば、常に有効です。別のスレッドがそのオブジェクト内で無効な状態を作成する可能性はありません。したがって、不変オブジェクトはスレッド セーフです。

  • ガベージ コレクション: ガベージ コレクターが不変オブジェクトについて論理的な決定を下すことがはるかに簡単になります。

アウトロ

この知識を身につければ、高パフォーマンスのコードを作成する能力が向上するだけでなく、応答性とスケーラビリティが最重要視される最新のソフトウェア開発の課題に備えることもできます。マルチスレッドの世界への旅を続けるとき、あなたが習得するそれぞれの概念が、開発者としての成長と、ユーザーの期待に応え、それを超えるアプリケーションを作成する能力に貢献することを忘れないでください。

今後の記事では、飢餓、デッドロック、競合状態、OS スケジューリングなどに焦点を当てていきますので、ご期待ください。これにより、プログラミング スキルが向上し、キャリアが向上します。

参考文献

この記事の作成を可能にしたオンライン ドキュメント、コミュニティ、利用可能なすべてのリソースに多大な感謝を申し上げます。

  1. インフォグラフィック
  2. マルチスレッドの基本概念を理解する
  3. 原子性
  4. 不変とは

免責事項: この記事は AI を利用して作成されています。記事の構成とアイデアのリストは 100% 手動で厳選および調査されています。情報の正確性を確保し、コンテキストを追加するために、AI が生成したすべてのテキストを校正します

リリースステートメント この記事は次の場所に転載されています: https://dev.to/anwaar/multithreading-key-concepts-for-engineers-part-1-4g73?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3