Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan penguncian semakan dua kali dalam fungsi Java untuk mencapai keselamatan benang?

Bagaimana untuk melaksanakan penguncian semakan dua kali dalam fungsi Java untuk mencapai keselamatan benang?

WBOY
WBOYasal
2024-05-03 11:48:01985semak imbas

Penguncian semakan dua kali ialah corak reka bentuk yang memastikan keselamatan benang melalui semakan dua kali Ia boleh dilaksanakan dalam fungsi Java seperti berikut: tentukan pembolehubah tidak menentu statik untuk menyimpan tika itu, semak semula dalam penyegerakan blok, sebagai Jika kosong, contoh dibuat; Kes praktikal: Dalam senario sumber dikongsi (seperti kelas cache), menggunakan penguncian semakan dua kali boleh memastikan semua rangkaian menggunakan contoh dikongsi yang sama, mengelakkan persaingan data dan memastikan integriti data.

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

Penguncian dua kali dalam fungsi Java: contoh praktikal untuk mencapai keselamatan benang

Pengunci yang disemak dua kali ialah corak reka bentuk yang menggunakan semakan dua kali untuk memastikan bahawa kejadian hanya dicipta sekali, dengan itu mencapai berbilang threading Benang selamat. Begini caranya untuk melaksanakan penguncian semak dua kali dalam fungsi 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;
    }
}

Kes praktikal: Benang sumber dikongsi

Pertimbangkan senario di mana benang berkongsi sumber, seperti kelas cache, di mana berbilang benang boleh mengakses data cache pada masa yang sama masa. Untuk mengelakkan keadaan perlumbaan data, kita perlu memastikan bahawa objek cache hanya dibuat sekali dan semua utas boleh mengaksesnya dengan selamat:

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

Dalam contoh di atas, kelas Cache menggunakan penguncian yang disemak dua kali untuk memastikan semua utas menggunakan contoh kongsi yang sama. Ini mengelakkan penciptaan berbilang kejadian cache, memastikan keselamatan benang dan integriti data.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan penguncian semakan dua kali dalam fungsi Java untuk mencapai keselamatan benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn