java - Bolehkah tidak menentu menyelesaikan masalah keselamatan data perkongsian benang?
欧阳克
欧阳克 2017-06-23 09:14:04
0
2
970

Sebagai contoh, jika saya ingin menulis corak tunggal, saya tidak akan menggunakan kaedah penyegerakan yang disegerakkan, tetapi menggunakan pengubahsuaian yang tidak menentu

Sigleton() persendirian{
}

Sigleton s tidak menentu statik peribadi = batal;

Sigleton statik awam getInstance(){

    if (s==null){
    s= new Singleton();
    }
    return s;

}

Bolehkah ini menyelesaikan masalah keselamatan benang?

Cara memahami keterlihatan benang

Jika saya mempunyai dua utas masuk pada masa yang sama jika s==null, bukankah dua objek sigleton baharu akan dicipta pada akhirnya?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

membalas semua(2)
女神的闺蜜爱上我

Jika overhed baharu adalah sangat kecil, tidak mengapa untuk anda menulis seperti ini. Tetapi jika overhed permulaan adalah tinggi, anda masih perlu menggunakan disegerakkan. kunci yang ditanda dua kali tipikal ditulis seperti ini:

private Singleton() {}

private static volitile Singleton s = null;

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

Cara memahami keterlihatan benang

Fahami model ingatan dahulu.

Benang tidak mengubah suai terus pembolehubah dalam ingatan utama, tetapi mula-mula menulis memori kerjanya sendiri, dan kemudian menyegerakkannya ke ingatan utama Jika ia belum disegerakkan, utas lain tidak akan melihat pengubahsuaian (mereka masih melihatnya cache memori kerja sendiri).

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan