Beberapa cara untuk menerapkan pola java singleton
Ini adalah berapa banyak buku yang ditulis:
kelas publik singleton1 {private singleton1 () {} private static singleton1 instance = null; public static singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } return instance; }}Namun, ini tidak ditulis dalam pengembangan aktual, karena ada masalah serius: ketika akses bersamaan multi-utas diakses, banyak contoh dapat dihasilkan! Lai
Berikut adalah beberapa metode yang umum digunakan:
1. Gunakan kata kunci yang disinkronkan
paket singleton; kelas publik singleton1 {private singleton1 () {} private static singleton1 instance = null; // Solusi 1 masalah multi-threading, tetapi tidak efisien! Karena setiap panggilan akan dikunci! public static Synchronized singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } return instance; } public void print () {System.out.println ("thread_id:"+thread.currentThread (). getId ()); } objek objek statis pribadi = objek baru (); // Metode yang sangat pintar, hanya ketika null ditambahkan, tidak ada singleton publicon1 getInstance2 () {if (instance == null) {disinkronkan (objek) {instance = new singleton1 (); }} return instance; }} 2. Tambahkan kunci
paket singleton; impor java.util.concurrent.locks.reentrantlock; kelas publik singleton2 {private singleton2 () {} private static reentrantlock lock = baru reentrantlock (); instance singleton2 private static = null; public void print () {System.out.println ("thread_id:"+thread.currentThread (). getId ()); } public static singleton2 getInstance2 () {if (instance == null) {lock.lock (); if (instance == null) {// Perhatikan bahwa ada penilaian lain di sini! Lai instance = new singleton2 (); } lock.unlock (); } return instance; }} 3. Gunakan variabel statis:
paket singleton; kelas publik singleton3 {public static void print () {System.out.println ("thread_id:"+thread.currentThread (). getId ()); } public static nested getNested () {return nested.instance; } // Ini adalah kelas yang dibuat oleh kelas singleton statis bersarang {private nested () {} static nested instance = new nested (); }}Di atas adalah pola penciptaan singleton yang umum digunakan:
Kode Tes Uji:
paket singleton; impor singleton.singleton3.nest; test kelas publik2 {public static void main (string [] args) {// TODO Metode yang dihasilkan otomatis Stub singleton bersarang; Myrunnable mm = myrunnable baru (); MyRunnable m1 = myRunnable baru (); Myrunnable2 m2 = myrunnable2 baru (); utas baru (m1) .start (); utas baru (m2) .start (); if (m1.singleton == m2.singleton) {// Ini adalah sistem yang sama.out.println ("adalah sama"); } else {System.out.println ("tidak sama"); }}} kelas myRunnable mengimplementasikan runnable {singleton bersarang; @Override public void run () {// TODO Metode yang dihasilkan otomatis Stub singleton = singleton3.getnested (); Singleton3.print (); }} kelas MyRunnable2 mengimplementasikan runnable {singleton bersarang; @Override public void run () {// TODO Metode yang dihasilkan otomatis Stub singleton = singleton3.getnested (); Singleton3.print (); }}Keluaran:
Itu sama
Thread_id: 11
Thread_id: 10
Di atas adalah kompilasi informasi model Java Singleton. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs web ini!