หลายวิธีในการใช้รูปแบบ Java Singleton
นี่คือจำนวนหนังสือที่เขียน:
คลาสสาธารณะ Singleton1 {Private Singleton1 () {} อินสแตนซ์แบบคงที่ส่วนตัว Singleton1 = NULL; สาธารณะคงที่ singleton1 getInstance () {ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = ใหม่ singleton1 (); } return อินสแตนซ์; -อย่างไรก็ตามสิ่งนี้ไม่ได้เขียนขึ้นในการพัฒนาจริงเนื่องจากมีปัญหาร้ายแรง: เมื่อเข้าถึงการเข้าถึงพร้อมกันหลายเธรดที่มีหลายเธรดอาจมีการสร้างหลายกรณี! -
นี่คือวิธีการที่ใช้กันทั่วไป:
1. ใช้คำหลักที่ซิงโครไนซ์
แพ็คเกจ Singleton; คลาสสาธารณะ Singleton1 {Private Singleton1 () {} อินสแตนซ์แบบคงที่ส่วนตัว Singleton1 = NULL; // วิธีแก้ปัญหา 1 ของปัญหามัลติเธรด แต่ก็ไม่มีประสิทธิภาพ! เพราะทุกสายจะถูกล็อค! Singleton1 GetInstance () {ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = ใหม่ singleton1 (); } return อินสแตนซ์; } public void print () {system.out.println ("thread_id:"+thread.currentthread (). getId ()); } วัตถุวัตถุคงที่ส่วนตัว = วัตถุใหม่ (); // วิธีที่ฉลาดมากเฉพาะเมื่อมีการเพิ่ม NULL ไม่มี Singleton Static Singleton1 GetInstance2 () {ถ้า (อินสแตนซ์ == null) {ซิงโครไนซ์ (วัตถุ) {อินสแตนซ์ = ใหม่ singleton1 (); }} ส่งคืนอินสแตนซ์; - 2. เพิ่มล็อค
แพ็คเกจ Singleton; นำเข้า java.util.concurrent.locks.reentrantlock; คลาสสาธารณะ Singleton2 {Private Singleton2 () {} Private Static Reentrantlock Lock = ใหม่ reentrantlock (); อินสแตนซ์แบบคงที่ส่วนตัว Singleton2 = null; public void print () {system.out.println ("thread_id:"+thread.currentthread (). getId ()); } สาธารณะคงที่ singleton2 getInstance2 () {ถ้า (อินสแตนซ์ == null) {lock.lock (); ถ้า (อินสแตนซ์ == null) {// โปรดทราบว่ามีการตัดสินอื่นที่นี่! - อินสแตนซ์ = ใหม่ singleton2 (); } lock.unlock (); } return อินสแตนซ์; - 3. ใช้ตัวแปรคงที่:
แพ็คเกจ Singleton; คลาสสาธารณะ singleton3 {public static void print () {system.out.println ("thread_id:"+thread.currentthread (). getId ()); } สาธารณะคงที่ public nested getnested () {return nested.instance; } // นี่คือคลาสที่สร้างขึ้นโดยคลาสสแตติกแบบสแตติกซิงเกิล {ซ้อนส่วนตัว () {} อินสแตนซ์ซ้อนกันคงที่ = ใหม่ซ้อนกัน (); -ข้างต้นเป็นรูปแบบการสร้างซิงเกิลที่ใช้กันทั่วไป:
รหัสทดสอบทดสอบ:
แพ็คเกจ Singleton; นำเข้า singleton.singleton3.nested; คลาสสาธารณะ test2 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub ซิงค์ซิงเกิลซิงเกิลซิงเกิล; myrunnable mm = new myrunnable (); myrunnable m1 = new myrunnable (); myrunnable2 m2 = ใหม่ myrunnable2 (); เธรดใหม่ (M1). start (); เธรดใหม่ (m2). start (); if (m1.singleton == m2.singleton) {// มันเป็น system.out.out.println ("เหมือนกัน"); } else {system.out.println ("ไม่เหมือนกัน"); }}} คลาส myrunnable onplunable runnable {ซิงเกิลซิงเกิล; @Override โมฆะสาธารณะ Run () {// todo วิธีการที่สร้างขึ้นอัตโนมัติ Stub Singleton = Singleton3.getNested (); Singleton3.print (); }} คลาส MyRunnable2 ใช้งาน Runnable {ซิงเกิลซิงเกิล; @Override โมฆะสาธารณะ Run () {// todo วิธีการที่สร้างขึ้นอัตโนมัติ Stub Singleton = Singleton3.getNested (); Singleton3.print (); -เอาท์พุท:
มันเหมือนกัน
Thread_id: 11
Thread_id: 10
ข้างต้นเป็นการรวบรวมข้อมูลโมเดล Java Singleton เราจะยังคงเพิ่มข้อมูลที่เกี่ยวข้องในอนาคต ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!