Yang pertama (pria malas, utasnya tidak aman):
Singleton kelas publik {private static singleton instance;
Cara menulis ini jelas, tetapi fatalnya adalah bahwa ia tidak dapat bekerja secara normal pada multi -utra.
Tipe kedua (pria malas, keamanan utas):
Singleton Publicon {Private Static Singlet Instance;
Cara menulis ini dapat bekerja dengan baik di multi -utusan, dan tampaknya juga memiliki pemuatan malas yang baik.
Ketiga (pria lapar):
Public Class Singleton {private static singlet instance = new singlet ();
Metode ini didasarkan pada mekanisme ClassLoder untuk menghindari masalah sinkronisasi multi -utara. memuat.
Tipe keempat (pria lapar, varian):
Public Singleton {private singlet instance = null;
Di permukaan, itu terlihat sangat berbeda.
Kelima (kelas internal statis):
Singleton kelas publik {private static class singleter {private static final singlet instance = new singleton ();} private singlet () {} public static l singleton getInstance () {return singletonHolder.instance;}}
Metode ini juga menggunakan mekanisme ClassLoder untuk memastikan bahwa hanya ada satu utas saat inisialisasi. Saat dimuat, maka instance akan dipakai (tidak mencapai efek pemuatan malas), dan metode ini adalah bahwa kelas singleton dimuat, dan instance mungkin tidak diinisialisasi. Karena kelas singletonHolder tidak secara aktif digunakan, itu hanya akan menampilkan kelas singletonHolder ketika ditampilkan dengan memanggil metode getInstance untuk secara instan instance instance. Bayangkan jika instance yang dilembagakan mengkonsumsi sumber daya, saya ingin dia menunda pemuatan. untuk menggunakannya agar dapat digunakan sebagai hasilnya. Pada saat ini, metode ini sangat masuk akal dibandingkan dengan cara ketiga dan keempat.
Tipe Keenam (Pencacahan):
public enum singleton {instance;
Metode ini adalah penulis Java Josh yang efektif.
Ketujuh (kunci sekolah ganda):
Singleton kelas publik {private volatile static singleton singleton; ;}}} Return singleton;}}
Ini adalah versi yang ditingkatkan dari cara kedua, umumnya dikenal sebagai kunci inspeksi ganda, silakan periksa detail: http://www.ibm.com/develeverworks/cn/java/j-dcl.html
Setelah JDK1.5, kunci inspeksi ganda dapat mencapai efek tunggal secara normal.
Meringkaskan
Ada dua pertanyaan yang harus diperhatikan:
1. Jika satu kasing dimuat oleh berbagai jenis loader, mungkin ada beberapa instance -case tunggal. Misalkan itu bukan akses jarak jauh.
2. Jika singleton mengimplementasikan antarmuka java.io.serializable, maka contoh kelas ini dapat diserialisasi dan dipulihkan. Bagaimanapun, jika Anda membuat serial objek dari kelas tunggal, dan kemudian mengembalikan banyak objek, maka Anda akan memiliki beberapa contoh kelas satu -case.
Cara memperbaiki pertanyaan pertama adalah:
Private Static Class GetClass (String ClassName)
Melempar ClassNotFoundException {
Classloader classloader = thread.currentThread ().
if (classloader == null)
classloader = singleton.class.getClassLoader ();
Return (ClassLoader.LoadClass (className));
}
}
Metode untuk memperbaiki pertanyaan kedua adalah
Kelas publik Singletton mengimplementasikan java.io.serializable {
Public Static Singleton Instance = Singleton baru ();
Singleton yang dilindungi () {
}
Objek pribadi readResolve () {
Instance return;
}
}
Bagi saya, saya lebih suka cara ketiga dan kelima, sederhana dan mudah dimengerti, dan menyadari keamanan utas di lapisan JVM (jika itu bukan lingkungan loader multi -kelas). Gunakan metode kelima hanya ketika efek pemuatan malas dicapai dengan jelas. Tidak akan menggunakan metode pertama dan kedua.
============================================= ========== ===============
Teman sekelas Superheizai diringkas dengan sangat baik:
Namun, secara umum, yang pertama bukan contoh tunggal, tipe keempat dan ketiga adalah satu. Oleh karena itu, para lajang umum adalah lima cara menulis. Pria malas, pria jahat, kunci sekolah ganda, enumerasi dan kelas internal statis.
Saya sangat senang memiliki pembaca seperti itu dan mendorong mereka bersama.