ความหมายของจอภาพของวัตถุใน Java คืออะไร? ทำไมต้องใช้คำนี้?


87

เมื่ออ่านบทความเกี่ยวกับเธรด Java ฉันมักจะสังเกตเห็นนิพจน์: "เธรดปัจจุบันเป็นเจ้าของจอภาพของอ็อบเจ็กต์นี้" ฉันเข้าใจความหมาย: เธรดได้รับสิทธิ์ในการทำงานกับวัตถุ แต่ฉันงงว่าทำไมเราถึงใช้วลี "the object's monitor" แทน "the object's lock"?

โดยสรุปฉันไม่รู้ความหมายของคำว่า 'มอนิเตอร์' คำถามอาจจะแปลกและเรียบง่าย แต่ฉันหวังว่าใครก็ได้สามารถช่วยแก้ไขได้ 3ks


1
+1 @ulmangt ที่เป็นคนเดียวที่ตอบคำถามของคุณได้จริงเราเรียกพวกเขาว่า "จอภาพ" เพราะนั่นคือสิ่งที่ Hoare เรียกพวกเขากลับมาในปี 1974
Solomon Slow

คำตอบ:


52

แต่ฉันงงว่าทำไมใช้คำว่า "the object's monitor" instend of "the object's lock"?

ดูคำตอบของ ulmangt สำหรับลิงก์ที่อธิบายคำว่า "มอนิเตอร์" ที่ใช้ในบริบทนี้ โปรดทราบว่า:

"จอภาพถูกคิดค้นโดย Per Brinch Hansen และ CAR Hoare และถูกนำมาใช้ครั้งแรกในภาษาปาสกาลพร้อมกันของ Brinch Hansen"

(ที่มา: Wikipedia )

เหตุใดจึงใช้คำว่า "จอภาพ" มากกว่า "ล็อก"? โดยเฉพาะอย่างยิ่งถ้าคุณใช้คำเหล่านี้ในลักษณะที่ตั้งใจจะใช้ในตอนแรก

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

  • "มอนิเตอร์" เป็นกลไกที่ทำให้มั่นใจได้ว่าเธรดเดียวเท่านั้นที่สามารถเรียกใช้โค้ดส่วน (หรือส่วนต่างๆ) ที่กำหนดในเวลาใดก็ได้ สิ่งนี้สามารถดำเนินการได้โดยใช้การล็อก (และ "ตัวแปรเงื่อนไข" ที่อนุญาตให้เธรดรอหรือส่งการแจ้งเตือนไปยังเธรดอื่น ๆ ว่าเป็นไปตามเงื่อนไข) แต่เป็นมากกว่าการล็อก อันที่จริงในกรณีของ Java การล็อกจริงที่ใช้โดยจอภาพไม่สามารถเข้าถึงได้โดยตรง (คุณไม่สามารถพูดว่า "Object.lock ()" เพื่อป้องกันไม่ให้เธรดอื่นได้รับมัน ... เช่นเดียวกับที่คุณสามารถทำได้ด้วยLockอินสแตนซ์Java )

ในระยะสั้นถ้าใครจะเป็น "มอนิเตอร์" ที่อวดรู้จริง ๆ แล้วเป็นคำที่ดีกว่า "ล็อก" สำหรับการระบุลักษณะเฉพาะของ Java แต่ในทางปฏิบัติทั้งสองคำจะใช้แทนกันได้เกือบหมด


22

จอภาพเป็นเพียงคำเรียกของวัตถุที่สามารถใช้วิธีการได้อย่างปลอดภัยในสภาพแวดล้อมแบบมัลติเธรด

มีบทความ Wikipedia ที่ยอดเยี่ยมเกี่ยวกับจอภาพ:

http://en.wikipedia.org/wiki/Monitor_( การซิงโครไนซ์)

หากคุณเลื่อนลงมาก็จะยิ่งมีส่วนอย่างชัดเจนเกี่ยวกับ Java


10

อ้างจากInside the Java Virtual Machine

เธรดในเครื่องเสมือน Java ร้องขอการล็อกเมื่อมาถึงจุดเริ่มต้นของขอบเขตมอนิเตอร์ ใน Java มีขอบเขตการมอนิเตอร์สองประเภท: คำสั่งที่ซิงโครไนซ์และวิธีการซิงโครไนซ์

ตรวจสอบ

จอภาพเปรียบเสมือนสิ่งปลูกสร้างที่มีห้องพิเศษหนึ่งห้องที่สามารถใช้งานได้ทีละเธรด ห้องนี้มักจะมีข้อมูลบางส่วน ตั้งแต่เวลาที่เธรดเข้ามาในห้องนี้จนถึงเวลาที่ออกไปเธรดจะสามารถเข้าถึงข้อมูลใด ๆ ในห้องได้โดยเฉพาะ การเข้าสู่อาคารมอนิเตอร์เรียกว่า "การเข้าสู่จอภาพ" การเข้าไปในห้องพิเศษภายในอาคารเรียกว่า "การรับจอภาพ" การครอบครองห้องนั้นเรียกว่า "การเป็นเจ้าของจอภาพ" และการออกจากห้องนั้นเรียกว่า "การปล่อยจอภาพ" การออกจากอาคารทั้งหมดเรียกว่า "ออกจากจอภาพ"

นอกเหนือจากการเชื่อมโยงกับบิตของข้อมูลแล้วจอภาพยังเชื่อมโยงกับโค้ดอย่างน้อยหนึ่งบิตซึ่งในหนังสือเล่มนี้จะเรียกว่าพื้นที่มอนิเตอร์

ดังที่ได้กล่าวไว้ก่อนหน้านี้ภาษามีสองวิธีในตัวในการระบุขอบเขตการมอนิเตอร์ในโปรแกรมของคุณ: คำสั่งที่ซิงโครไนซ์และวิธีการซิงโครไนซ์ กลไกทั้งสองนี้ซึ่งใช้ลักษณะการยกเว้นร่วมกันของการซิงโครไนซ์ได้รับการสนับสนุนโดยชุดคำสั่งของเครื่องเสมือน Java

ล็อค

ในการใช้ความสามารถในการยกเว้นร่วมกันของจอภาพเครื่องเสมือน Java จะเชื่อมโยงการล็อก (บางครั้งเรียกว่า mutex) กับแต่ละอ็อบเจ็กต์และคลาส การล็อกเป็นเหมือนสิทธิพิเศษที่เธรดเดียวเท่านั้นที่สามารถ "เป็นเจ้าของ" ได้ในคราวเดียว

เธรดเดียวได้รับอนุญาตให้ล็อกอ็อบเจ็กต์เดียวกันหลายครั้ง สำหรับแต่ละอ็อบเจ็กต์ Java virtual machine จะรักษาจำนวนครั้งที่อ็อบเจ็กต์ถูกล็อก วัตถุที่ปลดล็อคมีจำนวนศูนย์ เมื่อเธรดได้รับการล็อกเป็นครั้งแรกจำนวนจะเพิ่มขึ้นเป็นหนึ่งอีกครั้ง ทุกครั้งที่เธรดได้รับการล็อกบนวัตถุเดียวกันจำนวนจะเพิ่มขึ้นอีกครั้ง


6

synchronizedบล็อกรอบobjectคือจอภาพที่ควบคุมการล็อคบนวัตถุ นี่คือตัวอย่าง

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

4

แม้ว่าจะตอบคำถามนี้ช้า แต่ฉันก็คิดว่าจะเพิ่มในกรณีที่เป็นประโยชน์
นี่คือบล็อกโค้ด Java ที่ซิงโครไนซ์ภายในวิธี Java ที่ไม่ซิงโครไนซ์

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

ในตัวอย่างจะใช้ "this" ซึ่งเป็นอินสแตนซ์ที่วิธีการเพิ่มถูกเรียกใช้ วิธีการซิงโครไนซ์อินสแตนซ์ใช้วัตถุที่เป็นของมอนิเตอร์วัตถุ
=> เธรดเดียวเท่านั้นที่สามารถดำเนินการภายในบล็อกโค้ด Java ที่ซิงโครไนซ์บนอ็อบเจ็กต์มอนิเตอร์เดียวกัน


3

Java Virtual Machine ใช้จอภาพเพื่อรองรับมัลติเธรด จอภาพบรรลุสิ่งนี้ผ่านสองแนวคิด - การยกเว้นซึ่งกันและกันในขณะที่รันเธรด (นี่คือที่ที่ 'การล็อก' เข้ามาในรูปภาพ) และการประสานงานเป็นวิธีการสื่อสารระหว่างเธรด (นี่คือที่ที่วิธีการรอและแจ้งเตือนของอ็อบเจ็กต์เป็นภาพ)

การอ่านส่วนต่อไปนี้จาก "Inside JVM" จะช่วยขจัดข้อสงสัยนี้ได้มีการอธิบายไว้อย่างชัดเจนตรงนี้หรือไม่ (บทที่ 20 การซิงโครไนซ์เธรด) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

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