java的单例模式的一个问题
伊谢尔伦
伊谢尔伦 2017-04-18 10:30:14
0
6
471

java单例模式下面两种方法有什么区别?

方法一:

public class SingleTon {

private static SingleTon singleTon;

private SingleTon(){
}

public synchronized  static SingleTon getSingleTon(){
    if(singleTon == null){
        singleTon = new SingleTon();
    }
    return singleTon;
}

}

方法二:

public class SingleTon {


private static SingleTon singleTon = new SingleTon();

private SingleTon(){
}

public synchronized static SingleTon getSingleTon(){
    return singleTon;
}

}

请教一下这两种方法的区别是什么,哪个更好?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(6)
伊谢尔伦

Kaedah kedua adalah lebih baik kerana kaedah satu menggunakan konkurensi dan menggunakan prestasi.

Peter_Zhu

Ini adalah mod malas dan mod lapar. Saya tidak boleh mengatakan sama ada perkara seperti ini bagus atau tidak, ia bergantung kepada adegan sebenar.

迷茫

Kaedah 2 hanya menyediakan untuk konkurensi, iaitu, mengambil kira pemerolehan serentak objek tunggal sama ada akses serentak akan diputuskan oleh pengguna kelas ini.
Dua jenis ini masing-masing mempunyai kelebihan dan kekurangan yang tersendiri. Kaedah pertama adalah cepat untuk memuatkan, tetapi lebih perlahan untuk mendapatkan objek tunggal, kerana jika penghakiman digunakan, dan objek baru diambil semasa runtime Kaedah kedua adalah lebih perlahan untuk memuatkan kelas, tetapi lebih cepat untuk mendapatkan. Kerana ahli statik dimulakan apabila kelas dimuatkan Pada masa yang sama, kaedah kedua anda tidak perlu disegerakkan, kerana anda hanya mengembalikan rujukan kepada objek dan tidak melibatkan objek baharu

小葫芦

Ini adalah dua kaedah reka bentuk mod singleton kedua-duanya menggunakan penyegerakan untuk mengelakkan masalah keselamatan bersama dan yang pertama adalah kaedah reka bentuk lelaki yang malas dan yang kedua adalah kaedah reka bentuk lelaki yang lapar impak pada program itu sendiri. Perbezaannya ialah masa untuk mendapatkan objek adalah berbeza

PHPzhong

Mengenai mod singleton, sebenarnya terdapat 5 cara:

  1. Mod malas sepadan dengan kod pertama anda. Kelebihannya ialah: pemuatan tertunda. Kelemahannya ialah: penyegerakan kunci diperlukan setiap kali anda mendapatkan contoh, yang membazirkan sumber.

  2. Mod lapar, sepadan dengan kod kedua anda, mempunyai kelebihan sebagai selamat untuk benang, tetapi mempunyai kelemahan memuatkan sebaik sahaja ia muncul, yang membazir sumber.

  3. Mod malas kunci semak dua kali.

  4. Mod malas untuk kelas dalaman statik.

  5. Dalam Java Berkesan, disyorkan untuk menggunakan enum untuk melaksanakan singleton.

大家讲道理

Perbezaan antara kedua-duanya ialah kaedah yang pertama adalah pemuatan malas Jika kaedah ini tidak dipanggil, tiada objek akan dihasilkan, manakala yang kedua akan menjana contoh semasa memuatkan kelas, tidak kira sama ada ia digunakan atau tidak.
Kaedah pemuatan malas yang paling tipikal sepatutnya seperti ini

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

Ini menjimatkan masa dan tidak mencipta objek baharu.
Selain itu, jika konkurensi adalah sangat tinggi, anda boleh menggunakan tidak menentu untuk mengubah suai kejadian.

------------------------Saya tidak melihat kod anda dengan teliti, jadi saya akan menambah sesuatu lagi------ ----

Saya mendapati bahawa anda meletakkan kunci penyegerakan pada kaedah getInstance Ini sama sekali tidak diperlukan.

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