1. ซิงเกิลตันสไตล์จีนผู้หิวโหย
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะซิงเกิลตัน {
Singleton คงที่สุดท้ายส่วนตัว INSTANCE = new Singleton ();
ซิงเกิลตันส่วนตัว () { }
สาธารณะ Singleton getInstance () {
กลับอินสแตนซ์;
-
-
2. ด้วยความช่วยเหลือของคลาสภายใน
เป็น singleton แบบขี้เกียจเนื่องจากกลไก Java กำหนดว่าคลาสภายใน SingletonHolder จะถูกโหลด (ปรับใช้แบบขี้เกียจ) เมื่อเรียกใช้เมธอด getInstance() เป็นครั้งแรก และกระบวนการโหลดนั้นปลอดภัยสำหรับเธรด อินสแตนซ์จะถูกสร้างอินสแตนซ์หนึ่งครั้งเมื่อมีการโหลดคลาสภายใน
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะซิงเกิลตัน {
ซิงเกิลตันส่วนตัว () { }
SingletonHolder คลาสคงที่ส่วนตัว {
Singleton คงที่สุดท้ายส่วนตัว INSTANCE = new Singleton ();
-
สาธารณะ Singleton getInstance () {
กลับ SingletonHolder.INSTANCE;
-
-
3. น้ำยาล็อคแบบธรรมดา
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะซิงเกิลตัน {
อินสแตนซ์ Singleton แบบคงที่ส่วนตัว = null;
ซิงเกิลตันส่วนตัว () { }
สาธารณะแบบซิงโครไนซ์ Singleton getInstance () {
ถ้า (อินสแตนซ์ == null) {
อินสแตนซ์ = ซิงเกิลตันใหม่ ();
-
ส่งคืนอินสแตนซ์;
-
-
แม้ว่าปัญหาความปลอดภัยของเธรดจะได้รับการแก้ไข แต่การเรียกเธรดทุกรายการจะต้องถูกล็อค เราต้องการล็อคเฉพาะในครั้งแรกที่ถูกเรียก getInstance โปรดดูวิธีแก้ปัญหาการตรวจจับสองครั้งด้านล่าง
4. การตรวจจับซ้ำ แต่ใส่ใจกับวิธีการเขียน
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะซิงเกิลตัน {
อินสแตนซ์ Singleton แบบคงที่ส่วนตัว = null;
ซิงเกิลตันส่วนตัว () { }
สาธารณะ Singleton getInstance () {
ถ้า (อินสแตนซ์ == null) {
ซิงโครไนซ์ (Singleton.class) {
อุณหภูมิซิงเกิลตัน = อินสแตนซ์;
ถ้า (อุณหภูมิ == null) {
อุณหภูมิ = ซิงเกิลตันใหม่ ();
อินสแตนซ์=อุณหภูมิ
-
-
-
ส่งคืนอินสแตนซ์;
-
-
เนื่องจากปัญหาในการเรียงลำดับคำสั่งใหม่จึงไม่สามารถเขียนได้โดยตรงดังนี้
คลาสสาธารณะซิงเกิลตัน {
อินสแตนซ์ Singleton แบบคงที่ส่วนตัว = null;
ซิงเกิลตันส่วนตัว () { }
สาธารณะ Singleton getInstance () {
ถ้า (อินสแตนซ์ == null) {
ซิงโครไนซ์ (Singleton.class) {
ถ้า (อินสแตนซ์ == null) {
อินสแตนซ์ = ซิงเกิลตันใหม่ ();
-
-
-
ส่งคืนอินสแตนซ์;
-
-
แต่หากตัวแปรอินสแตนซ์ได้รับการแก้ไขด้วยความผันผวน ก็จะสามารถมั่นใจได้ว่าคำสั่งที่สอดคล้องกันของ instance = new Singleton(); จะไม่ถูกเรียงลำดับใหม่ ปลอดภัย:
คลาสสาธารณะซิงเกิลตัน {
อินสแตนซ์ Singleton ระเหยคงที่ส่วนตัว = null;
ซิงเกิลตันส่วนตัว () { }
สาธารณะ Singleton getInstance () {
ถ้า (อินสแตนซ์ == null) {
ซิงโครไนซ์ (Singleton.class) {
ถ้า (อินสแตนซ์ == null) {
อินสแตนซ์ = ซิงเกิลตันใหม่ ();
-
-
-
ส่งคืนอินสแตนซ์;
-
-