การรู้แนวคิดของการอ้างอิงที่อ่อนแอและอ่อนนุ่มนั้นแตกต่างจากวิธีการใช้งาน เราทุกคนรู้ว่านักสะสมขยะเรียกคืนหน่วยความจำสำหรับวัตถุที่ตรงตามเกณฑ์การรีไซเคิล แต่ไม่ใช่โปรแกรมเมอร์ทุกคนที่รู้ว่าเกณฑ์การรีไซเคิลขึ้นอยู่กับประเภทของการอ้างอิงที่ชี้ไปที่วัตถุ นี่คือความแตกต่างที่สำคัญระหว่างการอ้างอิงที่อ่อนแอและการอ้างอิงที่อ่อนนุ่มใน Java หากวัตถุมีเพียงการอ้างอิงที่อ่อนแอชี้ไปที่มันตัวเก็บขยะจะรีไซเคิลวัตถุทันทีซึ่งเป็นวิธีเร่งด่วนในการรีไซเคิล ค่อนข้างถ้ามีการอ้างอิงที่นุ่มนวลชี้ไปที่วัตถุเหล่านี้พวกเขาจะถูกนำกลับมาใช้ใหม่หาก JVM ต้องการหน่วยความจำ พฤติกรรมพิเศษของการอ้างอิงที่อ่อนแอและอ่อนนุ่มทำให้พวกเขามีประโยชน์มากในบางกรณี ตัวอย่างเช่น: การอ้างอิงที่อ่อนนุ่มสามารถใช้งานได้ดีในการใช้แคช การอ้างอิงที่อ่อนแอนั้นเหมาะสมมากสำหรับการจัดเก็บข้อมูลเมตาเช่นการจัดเก็บข้อมูลอ้างอิงคลาส หากไม่มีการโหลดคลาสจะไม่มีการอ้างอิงถึง classloader เช่นกัน เมื่อการอ้างอิงที่แข็งแกร่งล่าสุดถูกลบออกจะมีการรีไซเคิลคลาสอ้างอิงที่อ่อนแอเท่านั้น ในบทความนี้เราจะพูดคุยเกี่ยวกับการอ้างอิง Java ประเภทต่าง ๆ เช่น: การอ้างอิงที่แข็งแกร่งและ phantomreference
การอ้างอิงที่อ่อนแอเทียบกับการอ้างอิงที่อ่อนนุ่มใน Java
Java มีสี่ประเภทใน Java:
1. การอ้างอิงที่แข็งแกร่ง
2. อ่อนแอ
3. Softreference
4. Phantomreference
强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。 วัตถุใด ๆ ที่ชี้ไปที่การอ้างอิงที่แข็งแกร่งไม่สามารถรีไซเคิลได้โดยนักสะสมขยะและวัตถุเหล่านี้จำเป็นต้องใช้ในโปรแกรม การอ้างอิงที่อ่อนแอจะแสดงโดยคลาสคลาส Java.lang.ref.weakreference คลาสคลาสและคุณสามารถสร้างการอ้างอิงที่อ่อนแอโดยใช้รหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
เคาน์เตอร์ = ใหม่เคาน์เตอร์ ();
Weakreference <ounter> beatcounter = new beakreference <ounter> (ตัวนับ);
counter = null;
ตอนนี้ตราบใดที่คุณกำหนดค่า NULL ให้กับตัวนับของวัตถุอ้างอิงที่แข็งแกร่งวัตถุสามารถนำกลับมาใช้ใหม่ได้โดยตัวเก็บขยะ เนื่องจากวัตถุไม่ได้มีการอ้างอิงที่แข็งแกร่งอื่น ๆ อีกต่อไปในเวลานี้แม้แต่จุดที่อ่อนแอชี้ไปที่วัตถุไม่สามารถป้องกันตัวเก็บขยะจากการรีไซเคิลวัตถุ ในทางกลับกันหากวัตถุมีการอ้างอิงที่อ่อนนุ่มวัตถุตัวนับจะไม่ถูกรีไซเคิลทันทีเว้นแต่ JVM ต้องการหน่วยความจำ การอ้างอิงที่อ่อนนุ่มใน Java แสดงโดยคลาส java.lang.ref.softreference
การคัดลอกรหัสมีดังนี้:
Counter Prime = New Counter ();
Softrefere Soft = new Softreference (Prime);
prime = null;
หลังจากการอ้างอิงที่แข็งแกร่งนั้นว่างเปล่าพฤติกรรมที่สองของรหัสเคาน์เตอร์สร้างการอ้างอิงที่นุ่มนวล เมื่อพิจารณาถึงความแตกต่างระหว่างการอ้างอิงที่อ่อนนุ่มและการอ้างอิงที่อ่อนแอการอ้างอิงที่อ่อนนุ่มเหมาะสำหรับกลไกการแคชในขณะที่การอ้างอิงที่อ่อนแอนั้นเหมาะสมกว่าสำหรับการจัดเก็บข้อมูลเมตา อีกตัวอย่างหนึ่งของการใช้การอ้างอิงที่อ่อนแอคือ WeakHashMap ซึ่งเป็นอีกการดำเนินการของอินเตอร์เฟส MAP นอกเหนือจาก HASHMAP และ TREEMAP WeakHashMap มีคุณสมบัติ: ปุ่มในแผนที่ถูกห่อหุ้มเป็นข้อมูลอ้างอิงที่อ่อนแอซึ่งหมายความว่าเมื่อการอ้างอิงที่แข็งแกร่งถูกลบการอ้างอิงที่อ่อนแอภายใน WeakHashMap ไม่สามารถป้องกันไม่ให้วัตถุถูกรวบรวมโดยนักสะสมขยะ
การอ้างอิงเสมือนเป็นข้อมูลอ้างอิงที่สามที่มีอยู่ในแพ็คเกจ java.lang.ref แสดงโดยคลาส java.lang.ref.phantomreference วัตถุที่มีการอ้างอิงเสมือนสามารถรีไซเคิลได้โดยนักสะสมขยะได้ตลอดเวลา คล้ายกับการอ้างอิงที่อ่อนแอและการอ้างอิงที่อ่อนนุ่มคุณสามารถสร้างการอ้างอิงเสมือนจริงผ่านรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
DigitalCounter Digit = ใหม่ DigitalCounter ();
phantomreference phantom = phantomreference ใหม่ (ตัวเลข);
ตัวเลข = null;
เมื่อลบการอ้างอิงที่แข็งแกร่งวัตถุ DigitalCounter ในแถวที่สามสามารถนำกลับมาใช้ใหม่ได้โดยนักสะสมขยะได้ตลอดเวลา เนื่องจากมีการอ้างอิงเสมือนเพียงหนึ่งเดียวที่ชี้ไปที่วัตถุการอ้างอิงเสมือนจึงไม่สามารถป้องกันตัวเก็บขยะจากการเรียกคืนวัตถุ
นอกเหนือจากการทำความเข้าใจกับการอ้างอิงที่อ่อนแอการอ้างอิงที่อ่อนนุ่มการอ้างอิงเสมือนจริงและ beakhashmap คุณต้องเข้าใจ referenceQueue ในกระบวนการสร้างการอ้างอิงที่อ่อนแอการอ้างอิงที่อ่อนนุ่มและการอ้างอิงเสมือนจริงคุณสามารถให้การอ้างอิงคิวอ้างอิงผ่านรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter Digit = ใหม่ DigitalCounter ();
PhantomReference <PolyCounter> Phantom = new PhantomReference <DigitalCounter> (ตัวเลข, refqueue);
อินสแตนซ์อ้างอิงจะถูกเพิ่มลงในคิวการอ้างอิงและคุณสามารถรีไซเคิลวัตถุได้โดยสอบถามคิวอ้างอิงได้ตลอดเวลา วงจรชีวิตของวัตถุสามารถอธิบายได้ในรูปด้านล่าง: