ホームページ  >  記事  >  バックエンド開発  >  同時環境でのシングルトン モードのスレッド セーフティ ソリューション

同時環境でのシングルトン モードのスレッド セーフティ ソリューション

WBOY
WBOYオリジナル
2023-10-15 12:06:26862ブラウズ

同時環境でのシングルトン モードのスレッド セーフティ ソリューション

同時環境におけるシングルトン モードのスレッド セーフティ ソリューション

ソフトウェア開発のプロセスにおいて、シングルトン モードは、特定のクラスのみが実行されることを保証するために広く使用されています。インスタンスシナリオ。ただし、同時環境では、シングルトン パターンによりスレッド セーフティの問題が発生する可能性があります。この記事では、同時環境でシングルトン パターンのスレッド セーフを確保するための一般的なソリューションをいくつか紹介し、対応するコード例を示します。

1. 二重チェック ロック

Lazy スタイルとは、シングルトン クラスが初めて使用されるときにのみインスタンス化されることを意味します。このメソッドは、アプリケーションの実行時に二重チェック ロックを回避できます。アプリケーションのパフォーマンスを向上させるために、必要に応じてシングルトン インスタンスを作成します。ただし、マルチスレッド環境では、複数のスレッドが同時にインスタンス化コード ブロックに入ると、遅延により問題が発生する可能性があります。

この問題を解決するには、二重チェック ロック メカニズム、つまり Double-Checked Locking を使用できます。コード ブロックをインスタンス化する前に、synchronized キーワードを使用してクラスの静的メソッドを同期し、1 つのスレッドのみがインスタンス化コード ブロックに入ることができるようにします。さらに、同期されたコード ブロック内で 2 番目のチェックが実行され、ロックの待機中に他のスレッドがインスタンスを作成していないことが確認されます。

以下は、遅延ロック メカニズムと二重チェック ロック メカニズムを使用したシングルトン クラスのサンプル コードです。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

上記のコードでは、volatile として宣言されたインスタンス変数を使用して、変数が確実にすべてのスレッドの可視性に対して有効です。ダブルチェック ロック メカニズムにより、インスタンス化コード ブロックに入ることができるのは 1 つのスレッドだけであることが保証され、同時実行環境における怠け者のスレッド セーフティの問題が解決されます。

2. Hungry Chinese スタイル

Hungry Chinese スタイルとは、クラスの初期化時にインスタンスを作成することでシングルトン モードを実現することを指します。クラスが初期化されるときに、JVM は 1 つのスレッドのみがクラスを初期化できるようにするため、このメソッドはマルチスレッド環境ではスレッドセーフです。

以下は、Hungry スタイルを使用したシングルトン クラスのサンプル コードです。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

上記のコードでは、インスタンス変数は Final として宣言されており、割り当てられるのは 1 回のみであることが保証されています。静的コード ブロックでインスタンスを初期化すると、クラスのロード時にシングルトン インスタンスが確実に作成されるようになります。

3. 内部静的クラス

内部静的クラスとは、スレッドの安全性を確保するためにクラス読み込みメカニズムを使用しながら、インスタンスが初めて使用されるまでシングルトン インスタンスの作成を遅らせることを指します。このメソッドは遅延読み込みを実現するだけでなく、スレッドの安全性も確保します。

以下は、内部静的クラスを使用したシングルトン クラスのサンプル コードです:

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

上記のコードでは、SingletonHolder クラスはプライベートとして宣言されており、getInstance メソッドでのみ参照されます。 Singleton クラスのクラスがロードされます。クラスローダーはクラスのロード処理中はスレッドセーフであるため、SingletonHolder のスレッドセーフが保証されます。

概要:

この記事では、並行環境におけるシングルトン モードのスレッド セーフ ソリューションを紹介し、対応するコード例を示します。遅延スタイルでは、二重チェック ロック メカニズムを通じて複数のスレッドが同時にインスタンス化コード ブロックに入る問題を回避します。ハングリー スタイルでは、クラスの初期化を通じてスレッドの安全性が保証され、内部静的クラスは遅延読み込みとスレッドの安全性を組み合わせます。実際のニーズと使用シナリオに基づいて、適切なスレッド セーフティ ソリューションを選択すると、同時環境におけるシングルトン モードの効率と安定性を向上させることができます。

以上が同時環境でのシングルトン モードのスレッド セーフティ ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。