1. Lajang gaya Cina yang lapar
Copy kode kodenya sebagai berikut:
kelas publik Singleton {
private final static Singleton INSTANCE = new Singleton();
pribadi Singleton() {} }
getInstance Singleton statis publik() {
kembalikan INSTAN;
}
}
2. Dengan bantuan kelas internal
Ini adalah singleton yang malas karena mekanisme Java menetapkan bahwa kelas internal SingletonHolder hanya akan dimuat (diimplementasikan secara malas) ketika metode getInstance() dipanggil untuk pertama kalinya, dan proses pemuatannya aman untuk thread. Instance ini dibuat satu kali ketika kelas internal dimuat.
Copy kode kodenya sebagai berikut:
kelas publik Singleton {
pribadi Singleton() {} }
kelas statis pribadi SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
}
getInstance Singleton statis publik() {
kembalikan SingletonHolder.INSTANCE;
}
}
3. Solusi penguncian biasa
Copy kode kodenya sebagai berikut:
kelas publik Singleton {
contoh Singleton statis pribadi = null;
pribadi Singleton() {} }
Singleton getInstance tersinkronisasi statis publik() {
jika(contoh == nol) {
contoh = new Singleton();
}
contoh kembali;
}
}
Meskipun masalah keamanan thread telah terpecahkan, setiap thread yang memanggil getInstance harus dikunci. Kami hanya ingin mengunci saat pertama kali getInstance dipanggil. Silakan lihat solusi deteksi ganda di bawah.
4. Deteksi ganda, namun perhatikan cara penulisannya
Copy kode kodenya sebagai berikut:
kelas publik Singleton {
contoh Singleton statis pribadi = null;
pribadi Singleton() {} }
getInstance Singleton statis publik() {
jika(contoh == nol) {
disinkronkan(Singleton.kelas) {
Suhu tunggal = contoh;
jika(suhu == nol) {
temp = new Singleton();
contoh=temp
}
}
}
contoh kembali;
}
}
Karena masalah penataan ulang instruksi, maka tidak dapat ditulis langsung sebagai berikut:
kelas publik Singleton {
contoh Singleton statis pribadi = null;
pribadi Singleton() {} }
getInstance Singleton statis publik() {
jika(contoh == nol) {
disinkronkan(Singleton.kelas) {
jika(contoh == nol) {
contoh = new Singleton();
}
}
}
contoh kembali;
}
}
Tetapi jika variabel instance diubah dengan volatil, itu akan baik-baik saja. Jika diubah dengan volatil, ini dapat memastikan bahwa instruksi yang sesuai dari instance = new Singleton(); aman:
kelas publik Singleton {
instance Singleton statis pribadi yang mudah menguap = null;
pribadi Singleton() {} }
getInstance Singleton statis publik() {
jika(contoh == nol) {
disinkronkan(Singleton.class) {
jika(contoh == nol) {
contoh = new Singleton();
}
}
}
contoh kembali;
}
}