スレッドセーフを実現するために、Java 関数に二重チェックされたロックを実装するにはどうすればよいですか?

WBOY
リリース: 2024-05-03 11:48:01
オリジナル
978 人が閲覧しました

ダブル チェック ロックは、ダブル チェックによってスレッドの安全性を確保する設計パターンです。次のように Java 関数に実装できます。インスタンスが空の場合は、同期ブロックで再度チェックします。空の場合はインスタンスを作成し、インスタンスを返します。実際のケース: リソースが共有されるシナリオ (キャッシュ クラスなど) では、二重チェック ロックにより、すべてのスレッドが同じ共有インスタンスを使用するようになり、データの競合が回避され、データの整合性が保証されます。

Java 函数中的双重检查加锁如何实现线程安全?

#Java 関数のダブルチェック ロック: スレッド セーフを実現するための実際的なケース

ダブルチェック ロックは設計パターンです、二重チェックを使用してインスタンスが 1 回だけ作成されることを確認し、複数のスレッドでスレッドの安全性を実現します。 Java 関数でダブルチェック ロックを実装する方法は次のとおりです。

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;
    }
}
ログイン後にコピー

実践的なケース: スレッド共有リソース

スレッドがリソースを共有するシナリオを考えてみましょう。キャッシュ クラス。複数のスレッドがキャッシュされたデータに同時にアクセスできます。データ競合状態を回避するには、キャッシュ オブジェクトが 1 回だけ作成され、すべてのスレッドが安全にアクセスできることを確認する必要があります。

public class Cache {
    private static volatile Cache instance;

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

    // 此处省略缓存逻辑
}

// 使用缓存
List<String> sharedData = new ArrayList<>();
sharedData.add("Item 1");
sharedData.add("Item 2");

for (int i = 0; i < 10; i++) {
    new Thread(() -> {
        Cache cache = Cache.getInstance();
        // 使用共享数据,例如将它添加到缓存中
        cache.put("Key" + i, sharedData);
        cache.get("Key" + i);
    }).start();
}
ログイン後にコピー

上の例では、

Cache クラスは double を使用します。 -checked locking 。すべてのスレッドが同じ共有インスタンスを使用することを保証します。これにより、複数のキャッシュ インスタンスの作成が回避され、スレッドの安全性とデータの整合性が確保されます。

以上がスレッドセーフを実現するために、Java 関数に二重チェックされたロックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート