Dalam siaran ini, kami akan meneroka beberapa cara untuk melaksanakan singleton selamat-benang di Java, termasuk pemulaan yang tidak sabar-sabar, penguncian yang disemak dua kali, dan pendekatan kelas statik dalaman. Kami juga akan membincangkan sebab kata kunci terakhir bermanfaat dalam memastikan integriti satu tunggal.
Singleton berguna apabila anda memerlukan tepat satu contoh kelas sepanjang aplikasi. Kes penggunaan biasa termasuk mengurus sumber yang dikongsi seperti pengelogan, konfigurasi atau kumpulan sambungan. Singleton memastikan bahawa berbilang permintaan untuk mengakses kelas berkongsi contoh yang sama, dan bukannya membuat yang baharu.
Corak permulaan yang bersemangat mencipta tika tunggal apabila kelas dimuatkan. Ini adalah mudah dan memastikan keselamatan rangkaian kerana kejadian dibuat apabila kelas dimuatkan oleh JVM.
public final class Singleton { // Instance is created at class loading time private static final Singleton INSTANCE = new Singleton(); // Private constructor prevents instantiation from other classes private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }
Kebaikan:
Keburukan:
Bila Perlu Digunakan: Pemmulaan yang bersemangat adalah yang terbaik apabila kelas tunggal adalah ringan dan anda pasti ia akan digunakan semasa masa jalan aplikasi.
Dalam kes di mana anda ingin menangguhkan penciptaan singleton sehingga ia diperlukan (dikenali sebagai pemulaan malas), penguncian yang disemak dua kali menyediakan penyelesaian selamat benang. Ia menggunakan penyegerakan yang minimum dan memastikan tika itu dibuat hanya apabila ia diakses buat kali pertama.
public final class Singleton { // Marked as final to prevent subclassing // volatile ensures visibility and prevents instruction reordering private static volatile Singleton instance; // Private constructor prevents instantiation from other classes private Singleton() {} public static Singleton getInstance() { if (instance == null) { // First check (no locking) synchronized (Singleton.class) { // Locking if (instance == null) { // Second check (with locking) instance = new Singleton(); } } } return instance; } }
Semakan Pertama: Semakan if (instance == null) di luar blok yang disegerakkan membolehkan kami mengelak daripada mengunci setiap kali getInstance() dipanggil. Ini meningkatkan prestasi dengan memintas blok disegerakkan untuk panggilan akan datang selepas permulaan.
Blok Disegerakkan: Sebaik sahaja contoh adalah batal, memasukkan blok yang disegerakkan memastikan hanya satu urutan mencipta tikas Singleton. Urutan lain yang mencapai tahap ini mesti menunggu, menghalang keadaan perlumbaan.
Semakan Kedua: Di dalam blok disegerakkan, kami menyemak contoh sekali lagi untuk memastikan tiada utas lain telah memulakannya semasa utas semasa sedang menunggu. Semakan dua kali ini memastikan hanya satu tika Singleton dibuat.
Kata kunci yang tidak menentu adalah penting dalam corak penguncian yang disemak dua kali untuk mengelakkan penyusunan semula arahan. Tanpa itu, contoh pernyataan = new Singleton(); mungkin kelihatan lengkap pada urutan lain sebelum ia dimulakan sepenuhnya, yang membawa kepada contoh yang sebahagiannya dibina dikembalikan. jaminan yang tidak menentu bahawa apabila contoh bukan nol, ia dibina sepenuhnya dan kelihatan kepada semua urutan.
Kata kunci terakhir digunakan di sini untuk menghalang subkelas. Menandakan kelas Singleton sebagai akhir mempunyai dua faedah utama:
Menghalang Subkelas: Dengan menjadikan kelas akhir, kami menghalang kelas lain daripada melanjutkannya. Ini memastikan bahawa hanya satu tika kelas Singleton boleh wujud kerana subkelas boleh membawa kepada kejadian tambahan, yang akan memecahkan corak tunggal.
Ketidakbolehubah Isyarat: muktamad berfungsi sebagai penunjuk yang jelas kepada pembangun lain bahawa kelas tunggal bertujuan untuk tidak berubah dan tidak boleh dilanjutkan. Ini menjadikan kod lebih mudah difahami dan diselenggara.
Ringkasnya, akhir mengukuhkan integriti singleton dan membantu mengelakkan tingkah laku yang tidak dijangka daripada subkelas.
Kebaikan:
Keburukan:
Bila Menggunakannya: Corak ini berguna apabila kelas tunggal adalah intensif sumber dan mungkin tidak selalu diperlukan, atau apabila prestasi dalam persekitaran berbilang benang membimbangkan.
Pendekatan selamat benang alternatif untuk permulaan malas ialah corak kelas statik dalaman. Ini memanfaatkan mekanisme pemuatan kelas Java untuk memulakan instance tunggal hanya apabila ia diperlukan, tanpa penyegerakan yang jelas.
public final class Singleton { // Instance is created at class loading time private static final Singleton INSTANCE = new Singleton(); // Private constructor prevents instantiation from other classes private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }
Dalam corak ini, kelas SingletonHelper hanya dimuatkan apabila getInstance() dipanggil buat kali pertama. Ini mencetuskan permulaan INSTANCE, memastikan pemuatan malas tanpa memerlukan sekatan yang disegerakkan.
Kebaikan:
Keburukan:
Bila Perlu Digunakan: Gunakan corak kelas statik dalaman apabila anda mahukan permulaan malas dengan kod yang bersih dan boleh diselenggara. Ini selalunya menjadi pilihan pilihan kerana kesederhanaan dan keselamatan benang.
Kami telah melihat tiga cara popular untuk melaksanakan singleton selamat benang di Java:
Setiap pendekatan mempunyai kekuatannya dan sesuai untuk senario yang berbeza. Cuba mereka dalam projek anda sendiri dan lihat mana yang paling sesuai untuk anda! Beritahu saya dalam ulasan jika anda mempunyai pendekatan pilihan atau sebarang pertanyaan.
Selamat pengekodan! ?????
Atas ialah kandungan terperinci Jangan Biarkan Bujang Anda Berpisah! Inilah Cara Menjadikannya % Selamat Benang di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!