Penyelesaian keselamatan benang bagi mod tunggal dalam persekitaran serentak

WBOY
Lepaskan: 2023-10-15 12:32:01
asal
835 orang telah melayarinya

Penyelesaian keselamatan benang bagi mod tunggal dalam persekitaran serentak

Penyelesaian keselamatan benang bagi mod tunggal dalam persekitaran serentak

Dalam proses pembangunan perisian, mod tunggal digunakan secara meluas dalam senario di mana ia adalah perlu untuk memastikan bahawa hanya terdapat satu contoh kelas tertentu. Walau bagaimanapun, dalam persekitaran serentak, corak tunggal boleh menyebabkan masalah keselamatan benang. Artikel ini akan memperkenalkan beberapa penyelesaian biasa untuk memastikan keselamatan benang bagi corak tunggal dalam persekitaran serentak dan memberikan contoh kod yang sepadan.

1. Penguncian Disemak Dua Kali

Penguncian Disemak Berganda bermakna kelas tunggal dibuat instantiat apabila ia digunakan buat kali pertama. Walau bagaimanapun, dalam persekitaran berbilang benang, kemalasan boleh menyebabkan masalah dengan berbilang benang memasuki blok kod instantiasi pada masa yang sama.

Untuk menyelesaikan masalah ini, anda boleh menggunakan mekanisme penguncian semakan dua kali iaitu Penguncian Semakan Dua Kali. Sebelum membuat instantiation blok kod, gunakan kata kunci disegerakkan untuk menyegerakkan kaedah statik kelas untuk memastikan bahawa hanya satu thread boleh memasuki blok kod instantiation. Selain itu, semakan kedua dilakukan dalam blok kod disegerakkan untuk memastikan tiada utas lain yang mencipta contoh semasa menunggu kunci.

Berikut ialah contoh kod kelas tunggal menggunakan mekanisme penguncian malas dan disemak dua kali:

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;
    }
}
Salin selepas log masuk

Dalam kod di atas, pembolehubah instance yang diisytiharkan sebagai tidak menentu digunakan untuk memastikan keterlihatan pembolehubah kepada semua utas. Mekanisme penguncian yang disemak dua kali memastikan bahawa hanya satu utas boleh memasuki blok kod instantiasi, sekali gus menyelesaikan masalah keselamatan benang orang malas dalam persekitaran serentak.

2. Gaya Cina Lapar

Gaya Cina Lapar bermaksud melaksanakan corak tunggal dengan mencipta contoh apabila kelas dimulakan. Kaedah ini selamat untuk benang dalam persekitaran berbilang benang, kerana apabila kelas dimulakan, JVM akan memastikan bahawa hanya satu utas boleh memulakan kelas.

Berikut ialah contoh kod kelas tunggal menggunakan gaya Lapar:

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

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}
Salin selepas log masuk

Dalam kod di atas, pembolehubah ins diisytiharkan sebagai muktamad, memastikan ia hanya boleh diberikan sekali. Dengan memulakan contoh dalam blok kod statik, anda boleh memastikan bahawa tika tunggal dibuat apabila kelas dimuatkan.

3. Kelas statik dalaman

Kelas statik dalaman merujuk kepada menangguhkan penciptaan tika tunggal sehingga kali pertama tika itu digunakan, sambil menggunakan mekanisme pemuatan kelas untuk memastikan keselamatan benang. Kaedah ini bukan sahaja mencapai pemuatan malas, tetapi juga memastikan keselamatan benang.

Berikut ialah contoh kod untuk kelas singleton menggunakan kelas statik dalaman:

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

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}
Salin selepas log masuk

Dalam kod di atas, kelas SingletonHolder diisytiharkan sebagai peribadi dan hanya akan dimuatkan apabila kelas dirujuk dalam kaedah getInstance Singleton kelas. Memandangkan pemuat kelas adalah selamat benang semasa proses memuatkan kelas, keselamatan benang SingletonHolder boleh dijamin.

Ringkasan:

Artikel ini memperkenalkan penyelesaian keselamatan benang bagi mod tunggal dalam persekitaran serentak dan menyediakan contoh kod yang sepadan. Gaya malas mengelakkan masalah berbilang benang yang memasuki blok kod instantiasi pada masa yang sama melalui mekanisme penguncian semak dua kali Gaya lapar memastikan keselamatan benang melalui permulaan kelas, dan kelas statik dalaman menggabungkan pemuatan malas dan keselamatan benang. Berdasarkan keperluan sebenar dan senario penggunaan, memilih penyelesaian keselamatan benang yang sesuai boleh meningkatkan kecekapan dan kestabilan mod tunggal dalam persekitaran serentak.

Atas ialah kandungan terperinci Penyelesaian keselamatan benang bagi mod tunggal dalam persekitaran serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!