ก่อนเขียนกรณีเดียว:
ระดับสาธารณะ Singledemo {ส่วนตัว Static Singledemo S = Null; Private Singledemo () {} สาธารณะ singledemo getInstance () {ถ้า (s == null) {s = new Singledemo (); } return s; -เขียนคลาสทดสอบ:
ชั้นเรียนสาธารณะ ThreadDemo3 {โมฆะคงที่สาธารณะหลัก (String [] args) {Singledemo S1 = Singledemo.getInstance (); Singledemo S2 = Singledemo.getInstance (); System.out.println (S2 == S2); -ผลการทำงานเป็นจริงเสมอซึ่งหมายความว่าไม่มีปัญหาภายใต้เธรดเดียว มาเขียนมัลติเธรดเพื่อเข้าถึงเคสเดียว
Public Class Threadtest ใช้งาน Runnable {// การจัดเก็บวัตถุซิงเกิลตันโดยใช้ชุดคือการไม่เก็บองค์ประกอบที่ซ้ำกันชุดสาธารณะ <Sedledemo> ซิงเกิ้ล = new hashset <SondleDemo> (); @Override เป็นโมฆะสาธารณะ Run () {// รับ Singledemo S = Singledemo.getInstance (); // การเพิ่ม Singleton Singles.add (S); -ใช้การเข้าถึงแบบมัลติเธรดพร้อมกันกับ Singletons:
Public Class ThreadDemo3 {โมฆะคงที่สาธารณะหลัก (String [] args) {// Singledemo S1 = Singledemo.getInstance (); // Singledemo S2 = Singledemo.getInstance (); // system.out.println (S2 == S2); threadtest t = new Threadtest (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); เธรดใหม่ (t). start (); System.out.println (T.Singles); -
ผลการดำเนินการมีดังนี้:
[com.persagy.thread.singledemo@1bc4459, com.persagy.thread.singledemo@150bd4d]
หรือ
[com.persagy.thread.singledemo@12b6651]
หมายความว่ามีปัญหาด้านความปลอดภัยการเข้าถึงพร้อมกันและอินสแตนซ์ที่ได้รับอาจไม่เหมือนกัน
วิธีแก้ปัญหาความปลอดภัยของด้าย?
แน่นอนใช้กลไกการล็อคการซิงโครไนซ์
ต่อไปนี้เป็นการปรับปรุงซิงเกิล:
คลาสสาธารณะ Singledemo {ส่วนตัว Static Singledemo S = null; Private Singledemo () {} สาธารณะคงที่ singledemo getinstance () {ถ้า (s == null) {s = new Singledemo ();} return s;}}}}}}}}}}} ปัญหาความปลอดภัยของเธรดได้รับการแก้ไขหลังจากเพิ่มฟังก์ชั่นซิงโครนัส
เรียกใช้หลายครั้งเพื่อรับอินสแตนซ์เดียวกันและจะไม่มี 2 อินสแตนซ์
[com.persagy.thread.singledemo@12b6651]
อย่างไรก็ตามในกรณีของการเข้าถึงที่เกิดขึ้นพร้อมกันหลายเธรดแต่ละเธรดจะต้องตัดสินล็อคทุกครั้งที่ได้รับอินสแตนซ์ซึ่งมีประสิทธิภาพค่อนข้างต่ำ เพื่อปรับปรุงประสิทธิภาพฉันได้เพิ่มวิธีการตัดสินสองครั้งเพื่อแก้ปัญหาประสิทธิภาพ
รหัสมีดังนี้:
คลาสสาธารณะ Singledemo {ส่วนตัว Static Singledemo S = null; Private Singledemo () {} singledemo public Static Singledemo getInstance () {/ * หากเธรดแรกได้รับวัตถุอินสแตนซ์ของ Singleton * เมื่อเธรดที่ตามมาจะได้รับอินสแตนซ์ไม่จำเป็นต้องป้อนรหัสซิงโครไนซ์ */if (s == null) {// การล็อคที่ใช้ในบล็อกรหัสการซิงโครไนซ์คือวัตถุไฟล์ bytecode ของ singleton และล็อคนี้สามารถใช้ซิงโครไนซ์เท่านั้น (singledemo.class) {ถ้า (s == null) {s = new Singledemo ();}}}}}}}}}}}}}}}}วิธีนี้แก้ปัญหาความปลอดภัยของด้ายของคนขี้เกียจและปรับปรุงประสิทธิภาพ อย่างไรก็ตามในการพัฒนาจริงผู้คนจำนวนมากใช้คนที่หิวโหย ท้ายที่สุดรหัสนี้มีความซับซ้อนและซับซ้อนมากขึ้น
ด้านบนเป็นเนื้อหาที่สมบูรณ์ของโซลูชันที่สมบูรณ์แบบสำหรับปัญหาความปลอดภัยของด้ายขี้เกียจในโหมดการออกแบบเคสเดียวที่ตัวแก้ไขนำมาให้คุณ ฉันหวังว่าทุกคนจะสนับสนุน wulin.com เพิ่มเติม ~