Heim  >  Artikel  >  Java  >  Wie implementiert man doppelt überprüfte Sperren in Java-Funktionen, um Thread-Sicherheit zu erreichen?

Wie implementiert man doppelt überprüfte Sperren in Java-Funktionen, um Thread-Sicherheit zu erreichen?

WBOY
WBOYOriginal
2024-05-03 11:48:01935Durchsuche

Double-Check-Sperre ist ein Entwurfsmuster, das die Thread-Sicherheit durch doppelte Überprüfung gewährleistet. Es kann wie folgt in einer Java-Funktion implementiert werden: Definieren Sie eine statische flüchtige Variable, um eine Instanz zu speichern Synchronisationsblock, as Wenn leer, wird eine Instanz erstellt; die Instanz wird zurückgegeben. Praktischer Fall: In Szenarien, in denen Ressourcen gemeinsam genutzt werden (z. B. Cache-Klassen), kann durch doppeltes Sperren sichergestellt werden, dass alle Threads dieselbe gemeinsam genutzte Instanz verwenden, wodurch Datenkonkurrenz vermieden und die Datenintegrität sichergestellt wird.

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

Doppelt überprüftes Sperren in Java-Funktionen: ein praktisches Beispiel für das Erreichen von Thread-Sicherheit

Doppelt überprüftes Sperren ist ein Entwurfsmuster, das doppelte Überprüfung verwendet, um sicherzustellen, dass eine Instanz nur einmal erstellt wird, wodurch mehrere Einfädeln Thread sicher. So implementieren Sie die Doppelprüfungssperre in einer Java-Funktion:

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;
    }
}

Praktischer Fall: Thread-gemeinsame Ressourcen

Stellen Sie sich ein Szenario vor, in dem Threads Ressourcen gemeinsam nutzen, z. B. eine Cache-Klasse, in der mehrere Threads gleichzeitig auf zwischengespeicherte Daten zugreifen können Zeit. Um Datenwettlaufbedingungen zu vermeiden, müssen wir sicherstellen, dass das Cache-Objekt nur einmal erstellt wird und alle Threads sicher darauf zugreifen können:

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();
}

Im obigen Beispiel verwendet die Cache-Klasse doppelt überprüfte Sperren, um sicherzustellen, dass alle Threads das verwenden dieselbe gemeinsame Instanz. Dadurch wird die Erstellung mehrerer Cache-Instanzen vermieden und Thread-Sicherheit und Datenintegrität gewährleistet.

Das obige ist der detaillierte Inhalt vonWie implementiert man doppelt überprüfte Sperren in Java-Funktionen, um Thread-Sicherheit zu erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn