Dengan kata lain, apakah thread implementasi Singleton ini aman:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
akhirnya menjadi -1
bahkan tanpa threading . Ini bukan masalah keamanan thread. Alih-alih, penginisialisasi x = -1
berjalan pertama (pada baris sebelumnya dalam kode, nomor baris lebih rendah). Kemudian inisialisasi X = GetX()
dijalankan, yang membuat huruf besar X
sama dengan -1
. Dan kemudian konstruktor statis "eksplisit", tipe initializer static C() { ... }
berjalan, yang hanya mengubah huruf kecil x
. Jadi setelah semua itu, Main
metode (atau Other
metode) dapat melanjutkan dan membaca huruf besar X
. Nilainya akan -1
, bahkan hanya dengan satu utas.
Instance
sekaligus. Salah satu utas akan diperintahkan untuk pertama kali menjalankan penginisialisasi tipe (juga dikenal sebagai konstruktor statis). Sementara itu semua utas lainnya yang ingin membacaInstance
properti, akan dikunci hingga jenis inisialisasi selesai. Hanya setelah inisialisasi bidang selesai, utas akan diizinkan untuk mendapatkanInstance
nilai. Jadi tidak ada yang bisa melihatInstance
keberadaannull
.