ในโปรแกรม Java บางครั้งอาจจำเป็นต้องเลื่อนการดำเนินการเริ่มต้นวัตถุสูงบางส่วนและเริ่มต้นเฉพาะเมื่อใช้วัตถุเหล่านี้เท่านั้น สิ่งนี้เรียกว่าการเริ่มต้นล่าช้าหรือการโหลดขี้เกียจ
ดูการเริ่มต้นล่าช้าที่ไม่ปลอดภัย:
หลังจากเธรด A ดำเนินการ 1 พบว่าอินสแตนซ์ของวัตถุนั้นเป็นโมฆะและพร้อมที่จะใหม่ในขณะที่เธรด B ใหม่เป็นครั้งแรกซึ่งทำให้เกิดข้อผิดพลาด
เราสามารถใช้ล็อคการซิงโครไนซ์เพื่อให้แน่ใจว่าถูกต้อง:
แต่การซิงโครไนซ์วิธีการทั้งหมดนั้นแพงเกินไปและผู้คนมาพร้อมกับการล็อคตรวจสอบสองครั้ง:
การล็อคการซิงโครไนซ์ที่ใช้ในช่วงขั้นต่ำดูเหมือนว่าจะบรรลุวัตถุประสงค์โดยใช้การตรวจสอบสองครั้ง แต่สิ่งนี้มีปัญหา: เมื่อการดำเนินการเธรด 4, เธรด B 7 ยังไม่ได้ดำเนินการและเธรดจะกำหนดอินสแตนซ์! = null Thread B's 7 ยังไม่ถูกดำเนินการดังนั้นทำไมสิ่งนี้ถึงเกิดขึ้น?
ดูการใช้งานคีย์พื้นฐานของอินสแตนซ์ใหม่ ():
ในความเป็นจริงมันคือการดำเนินการครั้งแรก 1 จัดสรรหน่วยความจำจากนั้นเริ่มต้นวัตถุและตั้งค่าอินสแตนซ์ จากนั้นมีการจัดลำดับใหม่ที่นี่และคำสั่งของ 2 และ 3 อาจถูกแทนที่:
ดังนั้นเมื่อ B ยังคงดำเนินการ 7 จะกำหนดที่ 4 ว่าวัตถุอินสแตนซ์ได้รับการเริ่มต้น หากอินสแตนซ์ถูกเรียกก่อน ctorinstance (หน่วยความจำ) จะทำให้เกิดข้อผิดพลาด
มีสองวิธีแก้ปัญหา:
1. ประกาศวัตถุอินสแตนซ์ว่ามีความผันผวนมันจะห้ามการจัดลำดับใหม่ของ 2 และ 3
2. การใช้โซลูชันที่ใช้การเริ่มต้นคลาส: JVM จะดำเนินการเริ่มต้นคลาสในขั้นตอนการเริ่มต้นของคลาส (นั่นคือหลังคลาสจะถูกโหลดและก่อนที่จะใช้โดยเธรด) มีอยู่
ในระหว่างการเริ่มต้นของคลาสการดำเนินการ JVM จะได้รับการล็อค ล็อคนี้สามารถซิงโครไนซ์การเริ่มต้นของคลาสเดียวกันโดยหลายเธรด
เราจะพบว่ารหัสการใช้งานของโครงการตามการเริ่มต้นคลาสนั้นง่ายกว่า แต่รูปแบบการล็อคการตรวจสอบคู่ที่ใช้ความผันผวนมีข้อได้เปรียบเพิ่มเติม: นอกเหนือจากการเริ่มต้นการเริ่มต้นของฟิลด์คงที่มันยังสามารถชะลอการเริ่มต้นของฟิลด์อินสแตนซ์ การเริ่มต้นการหน่วงเวลาของฟิลด์ช่วยลดค่าใช้จ่ายของการเริ่มต้นคลาสหรือการสร้างอินสแตนซ์ แต่เพิ่มค่าใช้จ่ายของฟิลด์การเข้าถึงที่ล่าช้า เวลาส่วนใหญ่การเริ่มต้นปกติดีกว่าการเริ่มต้นล่าช้า หากคุณต้องการใช้การเริ่มต้นแบบล่าช้าแบบเธรดที่ปลอดภัยเช่นฟิลด์ตัวอย่างโปรดใช้รูปแบบการเริ่มต้นการเริ่มต้นล่าช้าตามความผันผวนที่อธิบายไว้ข้างต้น หากคุณต้องการใช้การกำหนดค่าเริ่มต้นที่ปลอดภัยสำหรับเธรดสำหรับฟิลด์คงที่โปรดใช้รูปแบบการเริ่มต้นแบบใช้คลาสที่อธิบายไว้ข้างต้น
สรุป
ข้างต้นคือรหัสการใช้งานของ Java Double Check Lock Lock ที่แนะนำโดย Editor ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!