[Pola desain] Pola Singleton (Pola Singleton)



  • Pria malas
public class Singleton {  private static Singleton instance;  private Singleton() {};  public static synchronized Singleton getInstance() {   if (instance == null) {     instance = new Singleton();   }   return instance;  }}

Ini diinisialisasi saat dipanggil untuk pertama kali;
penguncian tersinkronisasi memastikan keamanan thread;

  • Cina lapar
public class Singleton {  private static Singleton instance = new Singleton();  private Singleton() {};  public static Singleton getInstance() {   return instance;  }}

Kelas dibuat instance-nya saat dimuat, menghindari masalah sinkronisasi multi-utas dan tidak perlu mengunci;

  • Kunci cek ganda (DCL, penguncian ganda)
public class Singleton {  private volatile static Singleton instance;  private Singleton() {};  public static Singleton getInstance() {   if (instance == null){     synchronized (Singleton.class) {      if (instance == null){        instance = new Singleton();      }     }   }   return instance;  }}

Ini diinisialisasi ketika dipanggil untuk pertama kalinya;
kata kunci volatile menjamin visibilitas variabel di bawah beberapa utas dan mencegah penataan ulang instruksi;
melalui penguncian dan pemeriksaan ganda apakah akan dipakai untuk menghindari masalah beberapa utas membuat contoh; seperti:
kapan instance Jika belum dibuat, thread t1 memanggil metode getInstance, dan menilai instance == null benar untuk pertama kalinya, melanjutkan eksekusi, dan memasuki blok kode sinkronisasi. Sebelum t1 membuat instance, thread t2 juga memanggil metode getInstance, dan karena instance belum dibuat, t2 juga dapat terus mengeksekusi melalui if. T1 keluar dari blok kode sinkronisasi setelah membuat instance, dan memasuki t2. Pada saat ini, jika tidak ada detik jika, maka t2 juga akan membuat instance, tetapi menambahkan satu detik jika dapat menghindari pembuatan multi-threaded instance beberapa kali masalah.

  • Kelas dalam statis
public class Singleton {  private static class SingletonHolder {   private static final Singleton INSTANCE = new Singleton();  }  private Singleton() {};  public static final Singleton getInstance() {   return SingletonHolder.INSTANCE;  }}

Gunakan mekanisme pemuatan kelas untuk menghindari masalah sinkronisasi multi-utas;
kelas internal statis menunda inisialisasi, dan hanya jika metode getInstance dipanggil, kelas internal akan dimuat dan dibuat instance-nya;

Comments

Popular posts from this blog

[Perdagangan Luar Negeri Hari Ini] JioMart meningkat pesat, dengan rata-rata 1 juta pengguna aktif harian!

Replika open source di GitHub: Diablo 2

Laporan Analisis Tren Industri Ritel 2021