จุดสำคัญที่ยังไม่ได้กล่าวถึงคือการมีสถานะของวัตถุที่ไม่แน่นอนทำให้มันเป็นไปได้ที่จะมีตัวตนของวัตถุที่ encapsulate รัฐนั้นจะไม่เปลี่ยนรูป
หลายโปรแกรมได้รับการออกแบบมาเพื่อจำลองสิ่งต่าง ๆ ในโลกแห่งความเป็นจริง สมมติว่าเวลา 12:51 น. ตัวแปรบางตัวAllTrucks
มีการอ้างอิงถึง object # 451 ซึ่งเป็นรากของโครงสร้างข้อมูลซึ่งระบุว่ามีสินค้าใดบ้างในรถบรรทุกทั้งหมดของกองทัพเรือในเวลานั้น (12:51 น.) และตัวแปรบางอย่างBobsTruck
สามารถใช้เพื่อรับการอ้างอิงถึงวัตถุ # 24601 คะแนนไปยังวัตถุซึ่งระบุว่ามีสินค้าใดบ้างที่บรรทุกอยู่ในรถบรรทุกของ Bob ในเวลานั้น (12:51 น.) เมื่อเวลา 12:52 น. รถบรรทุกบางส่วน (รวมถึงของ Bob) จะถูกโหลดและไม่โหลดและโครงสร้างข้อมูลจะได้รับการอัปเดตดังนั้นAllTrucks
ตอนนี้จะมีการอ้างอิงไปยังโครงสร้างข้อมูลซึ่งบ่งชี้ว่าสินค้าอยู่ในรถบรรทุกทั้งหมดตั้งแต่ 12:52 น
จะเกิดอะไรขึ้นBobsTruck
?
หากคุณสมบัติ 'บรรทุกสินค้า' ของวัตถุรถบรรทุกแต่ละชิ้นไม่เปลี่ยนรูปแบบแล้ววัตถุ # 24601 จะเป็นตัวแทนของรัฐที่รถบรรทุกของ Bob มีเวลา 12:51 น. หากBobsTruck
มีการอ้างอิงโดยตรงไปยัง object # 24601 ดังนั้นหากรหัสที่มีการอัปเดตAllTrucks
เกิดขึ้นเพื่ออัปเดตBobsTruck
ก็จะยุติการแสดงสถานะปัจจุบันของรถบรรทุกของ Bob โปรดทราบว่านอกจากBobsTruck
จะถูกเก็บไว้ในวัตถุที่ไม่แน่นอนบางรูปแบบวิธีเดียวที่รหัสซึ่งการอัปเดตAllTrucks
สามารถอัปเดตจะเป็นถ้ารหัสนั้นได้รับการโปรแกรมอย่างชัดเจน
หากต้องการใช้BobsTruck
เพื่อสังเกตสถานะรถบรรทุกของ Bob ในขณะที่ยังคงรักษาวัตถุทั้งหมดที่ไม่เปลี่ยนรูปหนึ่งอาจมีBobsTruck
ฟังก์ชั่นที่ไม่เปลี่ยนรูปซึ่งเมื่อได้รับค่าที่AllTrucks
มีหรือ ณ เวลาใดก็ตามจะให้สถานะของรถบรรทุกของ Bob ที่ เวลานั้น. เราสามารถมีฟังก์ชั่นที่ไม่เปลี่ยนรูปแบบได้ซึ่งหนึ่งในนั้นจะเป็นข้างต้นและอีกอันหนึ่งจะยอมรับการอ้างอิงไปยังสถานะของกองทัพเรือและรัฐรถบรรทุกใหม่และกลับไปอ้างอิงถึงสถานะของกองทัพเรือใหม่ที่ จับคู่กับรถเก่ายกเว้นรถบรรทุกของ Bob จะมีสถานะใหม่
น่าเสียดายที่การใช้ฟังก์ชั่นดังกล่าวทุกครั้งที่ต้องการเข้าถึงสถานะของรถบรรทุกของบ๊อบอาจทำให้รำคาญและยุ่งยาก อีกวิธีหนึ่งที่จะบอกว่าวัตถุ # 24601 จะตลอดไปและตลอดไป (ตราบใดที่ทุกคนมีการอ้างอิงถึง) เป็นตัวแทนของสถานะปัจจุบันของรถบรรทุกของ Bob รหัสที่จะต้องการเข้าถึงสถานะปัจจุบันของรถบรรทุกของบ๊อบซ้ำ ๆ ไม่จำเป็นต้องเรียกใช้ฟังก์ชั่นที่ใช้เวลานานทุกครั้ง - มันสามารถทำหน้าที่ค้นหาเพียงครั้งเดียวเพื่อค้นหาว่าวัตถุ # 24601 นั้นเป็นรถบรรทุกของ Bob แล้ว เข้าถึงวัตถุนั้นได้ทุกเมื่อที่ต้องการดูสถานะปัจจุบันของรถบรรทุกของ Bob
โปรดทราบว่าวิธีการทำงานนั้นไม่มีประโยชน์ในสภาพแวดล้อมแบบเธรดเดียวหรือในสภาพแวดล้อมแบบมัลติเธรดโดยที่เธรดส่วนใหญ่จะทำการสังเกตข้อมูลแทนที่จะเปลี่ยนมัน เธรดผู้สังเกตการณ์ใด ๆ ที่คัดลอกการอ้างอิงวัตถุที่มีอยู่ในAllTrucks
จากนั้นตรวจสอบสถานะของรถบรรทุกที่เป็นตัวแทนดังนั้นจะเห็นสถานะของรถบรรทุกทั้งหมด ณ เวลาที่คว้าการอ้างอิง ทุกครั้งที่เธรดผู้สังเกตการณ์ต้องการเห็นข้อมูลที่ใหม่กว่าก็สามารถดึงการอ้างอิงใหม่ได้ ในอีกทางหนึ่งการมีสถานะทั้งหมดของกองทัพเรือที่แสดงโดยวัตถุที่ไม่เปลี่ยนรูปเพียงอันเดียวจะตัดทอนความเป็นไปได้ของสองเธรดที่อัพเดตรถบรรทุกที่แตกต่างกันพร้อมกันเนื่องจากแต่ละเธรดถ้าทิ้งไว้กับอุปกรณ์ของตัวเอง สถานะใหม่ของรถบรรทุกและรัฐเก่าของกันและกัน ความถูกต้องอาจมั่นใจได้หากแต่ละเธรดใช้CompareExchange
เพื่ออัปเดตAllTrucks
เฉพาะเมื่อไม่เปลี่ยนแปลงและตอบกลับไปที่ล้มเหลวCompareExchange
โดยการสร้างออบเจ็กต์สถานะใหม่และลองการดำเนินการซ้ำ แต่ถ้ามีมากกว่าหนึ่งเธรดพยายามดำเนินการเขียนพร้อมกันประสิทธิภาพโดยทั่วไปจะแย่กว่าการเขียนทั้งหมดที่ทำบนเธรดเดี่ยว ยิ่งเธรดพยายามดำเนินการพร้อมกันมากเท่าไรประสิทธิภาพก็จะยิ่งแย่ลงเท่านั้น
หากวัตถุรถบรรทุกแต่ละชิ้นไม่แน่นอน แต่มีตัวตนที่ไม่เปลี่ยนรูปแบบสถานการณ์แบบมัลติเธรดจะสะอาดขึ้น อาจอนุญาตให้ใช้เธรดเดียวเท่านั้นในแต่ละครั้งบนรถบรรทุกใดก็ตาม แต่เธรดที่ทำงานบนรถบรรทุกที่แตกต่างกันสามารถทำได้โดยไม่มีการรบกวน ในขณะที่มีวิธีการหนึ่งที่สามารถเลียนแบบพฤติกรรมดังกล่าวแม้ว่าจะใช้วัตถุที่ไม่เปลี่ยนรูป (เช่นสามารถกำหนดวัตถุ "AllTrucks" เพื่อให้การตั้งค่าสถานะของรถบรรทุกที่เป็นของ XXX เป็น SSS นั้นจะต้องสร้างวัตถุที่กล่าวว่า "เป็น [เวลา] สถานะของรถบรรทุกที่เป็นของ [XXX] คือตอนนี้ [SSS] สถานะของทุกสิ่งอื่นคือ [ค่าเก่าของ AllTrucks] "การสร้างวัตถุเช่นนี้จะเร็วพอที่แม้จะมีการโต้แย้งก็ตามCompareExchange
วงจะใช้เวลาไม่นาน ในทางกลับกันการใช้โครงสร้างข้อมูลดังกล่าวจะช่วยเพิ่มระยะเวลาในการค้นหารถบรรทุกของบุคคลโดยเฉพาะอย่างยิ่ง การใช้วัตถุที่ไม่แน่นอนที่มีตัวตนที่ไม่เปลี่ยนรูปได้จะช่วยหลีกเลี่ยงปัญหานั้นได้