แนวคิดมันหมายความว่าอย่างไรเมื่อมีการกล่าวว่าแต่ละเธรดได้รับสแต็กของตัวเอง?


10

ฉันได้อ่านJava Concurrency ในทางปฏิบัติโดย Brian Goetz และในส่วนStack Confinementมีการกล่าวถึงว่าแต่ละเธรดได้รับสแต็กของตัวเองและตัวแปรในเครื่องจึง จำกัด อยู่ภายในเธรดที่กำลังดำเนินการ มีอยู่ในเธรดที่กำลังเรียกใช้งานซึ่งไม่สามารถเข้าถึงได้กับเธรดอื่น เขาหมายความว่าอะไรที่แต่ละเธรดมีสแตกการเรียกใช้ของตนเอง


4
เพื่อความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับสิ่งนี้ค้นหาทะเบียนสแต็คพอยน์เตอร์และวิธีใช้ในการประกอบ สิ่งนี้จะอธิบายว่าเธรดสามารถมีสแต็กของตนเองได้อย่างง่ายดายได้อย่างไร
ปีเตอร์สมิ ธ

1
เห็นด้วยกับปีเตอร์สมิ ธ อาจใช้เวลา แต่หลังจากนั้นคุณจะได้รับความรู้ที่สมบูรณ์แบบเกี่ยวกับสิ่งที่เป็นอย่างไรและทำไมเกิดขึ้น
superM

คำตอบ:


13

คุณรู้หรือไม่ว่าเมื่อใดที่คุณไปที่ดีบักเกอร์ไม่ว่าด้วยเหตุผลใดและ IDE ให้การติดตามสแต็ก และแต่ละวิธี (กรอบสแต็ค) มีชุดของตัวแปรท้องถิ่นที่คุณสามารถตรวจสอบในการดีบัก?

นั่นคือ "การประมวลผลสแต็ก" ของโปรแกรมของคุณ มันแสดงให้เห็นถึงสถานะท้องถิ่นของโปรแกรมของคุณในขณะนี้ สิ่งที่ผู้เขียนพูดก็คือแต่ละเธรดได้รับสแต็กการประมวลผลที่แตกต่างกันเช่นนั้น มันมีสแต็คการโทรของตัวเองและแต่ละวิธีมีตัวแปรท้องถิ่นของตัวเอง

เนื่องจากตัวแปรถูกเก็บไว้เป็นส่วนหนึ่งของการประมวลผลสแต็กและไม่ได้อยู่ในฮีปพวกเขาจึงไม่ซ้ำกับเธรดที่กำลังทำงานอยู่และไม่สามารถแชร์ได้โดยตรง คุณสามารถคัดลอกหรือส่งต่อการอ้างอิงไปยังวัตถุไปยังเธรดอื่น ๆ ได้หลายวิธี แต่นั่นก็เป็นความแตกต่างทางวิชาการเป็นส่วนใหญ่


โปรดเพิ่มการเน้นที่ชัดเจนยิ่งขึ้นในย่อหน้าที่สามของคุณเพื่อระบุว่าตัวแปรท้องถิ่นที่เปิดรับเธรดอื่น ๆ หรือวัตถุที่มีอายุยืนยาวจะไม่ถูก จำกัด อีกต่อไป ดังนั้นการอ้างสิทธิ์ที่ยกมาจากหนังสือของ OP น่าสงสัยมาก
ร.ต.ต.

4
@rwong: มันเป็นไปไม่ได้ที่จะเปิดเผยตัวแปรท้องถิ่นไปยังเธรดอื่นในวิธีที่จะเป็นปัญหา ตัวแปรมีเพียงข้อมูลพื้นฐานหรือการอ้างอิงเท่านั้น วัตถุอาศัยอยู่บนกอง
Michael Borgwardt

@MichaelBorgwardt ให้สองกรณีแยกกันบอกว่าตัวแปรมีดั้งเดิมซึ่งเป็นกรณี A และพูดว่าตัวแปรที่มีการอ้างอิงซึ่งเป็นกรณี B เนื่องจากการส่งผ่านค่าพื้นฐานตัวแปรโลคัลจึงเป็นเธรดที่ปลอดภัย แต่เกี่ยวข้องกับการอ้างอิง พวกเขาสามารถผ่านไปรอบ ๆ ? ทำไมคุณถึงพูดว่ามันเป็นไปไม่ได้?
Geek

2
@Geek: เนื่องจากตัวแปรและวัตถุที่อ้างถึงนั้นเป็นสองสิ่งที่แยกกันและแตกต่างกันซึ่งไม่ควรสับสนเมื่อพูดถึงรายละเอียดในระดับนี้ ตัวแปรโลคัลไม่สามารถสัมผัสกับเธรดอื่นได้ วัตถุสามารถทำได้อย่างแน่นอน
Michael Borgwardt

@MichaelBorgwardt ฉันเห็นสิ่งที่คุณพูดขอบคุณสำหรับการชี้แจง
Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.