รูปแบบการตรวจสอบสองครั้งถูกกล่าวถึงในมาตรา 48 ของหนังสือ Java ที่มีประสิทธิภาพและมีการชี้ให้เห็นว่ารูปแบบนี้ไม่สามารถใช้ได้ใน Java โครงสร้างของรูปแบบนี้มีดังนี้:
ทรัพยากรสาธารณะ getResource () {ถ้า (ทรัพยากร == null) {ซิงโครไนซ์ (นี่) {ถ้า (ทรัพยากร == null) {ทรัพยากร = ทรัพยากรใหม่ (); }}} ทรัพยากรส่งคืน; -รูปแบบนี้เป็นการปรับปรุงรหัสต่อไปนี้:
ทรัพยากรที่ซิงโครไนซ์สาธารณะ getResource () {ถ้า (ทรัพยากร == null) {ทรัพยากร = ทรัพยากรใหม่ (); } กลับทรัพยากร; -วัตถุประสงค์ของรหัสนี้คือการชะลอการเริ่มต้นทรัพยากร แต่ทุกครั้งที่คุณเข้าถึงได้คุณจะต้องซิงโครไนซ์ เพื่อลดค่าใช้จ่ายของการซิงโครไนซ์โหมดตรวจสอบสองครั้งจะพร้อมใช้งาน
เหตุผลที่โหมดการตรวจสอบซ้ำสองครั้งไม่ถูกต้องใน Java คือประเภทการอ้างอิงไม่ปลอดภัยกับเธรดในกรณีที่ไม่มีการซิงโครไนซ์ สำหรับประเภทพื้นฐานยกเว้นโหมดการตรวจสอบสองครั้งสองครั้งสองครั้ง ตัวอย่างเช่นรหัสต่อไปนี้ถูกต้อง:
จำนวน int ส่วนตัว; public int getCount () {ถ้า (count == 0) {ซิงโครไนซ์ (นี่) {ถ้า (นับ == 0) {count = computecount (); // การคำนวณที่ใช้เวลานาน}}} นับคืน; -ข้างต้นเป็นข้อสรุปทั่วไปเกี่ยวกับสำนวนการตรวจสอบสองครั้งใน Java แต่สิ่งต่าง ๆ ยังไม่จบเพราะรูปแบบความทรงจำของ Java ก็มีการปรับปรุงเช่นกัน Doug Lea เขียนไว้ในบทความของเขา: "ตามโมเดลหน่วยความจำ JSR133 Java ล่าสุดหากประเภทการอ้างอิงถูกประกาศว่าผันผวนโหมดการตรวจสอบสองครั้งจะทำงานได้" ดังนั้นในอนาคตคุณต้องใช้โหมดการตรวจสอบสองครั้งใน Java คุณสามารถใช้รหัสต่อไปนี้:
ทรัพยากรทรัพยากรผันผวนส่วนตัว ทรัพยากรสาธารณะ getResource () {ถ้า (ทรัพยากร == null) {ซิงโครไนซ์ (นี่) {ถ้า (ทรัพยากร == null) {ทรัพยากร = ทรัพยากรใหม่ (); }}} ทรัพยากรส่งคืน; -แน่นอนว่าต้องอยู่ใน Java ที่เป็นไปตามข้อกำหนด JSR133
ดังนั้นการตรวจสอบสองครั้งจึงไม่สามารถใช้ได้ใน J2SE 1.4 หรือรุ่นก่อนหน้าเนื่องจากการเขียนที่ไม่ได้สั่งซื้อเมื่อปรับแต่งในมัลติเธรดหรือ JVM ปัญหานี้ได้รับการแก้ไขใน J2SE 5.0 และคำหลักที่ผันผวนสามารถใช้เพื่อให้แน่ใจว่ามีซิงเกิ้ลภายใต้มัลติเธรด
คลาสสาธารณะ Singleton {อินสแตนซ์ Singleton ที่ผันผวนส่วนตัว = NULL; Public Singleton getInstance () {ถ้า (อินสแตนซ์ == null) {ซิงโครไนซ์ (นี่) {ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = ใหม่ singleton (); }} ส่งคืนอินสแตนซ์; -วิธีการที่แนะนำคือการเริ่มต้น on Demand Holder (IODH)
ระดับสาธารณะ Singleton {คลาสคงที่ singletonholder {อินสแตนซ์แบบสแตติกซิงเกิ้ล = นิวซิงเกิล (); } สาธารณะคงที่ Singleton getInstance () {return singletonholder.instance; -ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java