จอภาพใน Java คืออะไร?


130

จอภาพที่อ้างถึงในการเขียนโปรแกรมพร้อมกันใน Java คืออะไร?

เมื่ออ่านพบว่า "ทุกวัตถุเชื่อมโยงกับจอภาพ" หมายความว่าอย่างไร

เป็นวัตถุพิเศษหรือไม่?


11
+1 สิ่งนี้ทำให้ฉันได้อ่านวิธีการใช้งานจอภาพในระดับ JVM เรียนรู้สิ่งใหม่
naikus

@naikus ฉันคาดหวังการแบ่งปันรายละเอียดจากคุณ :)
roottraveller

คำตอบ:


90

จอภาพเป็นกลไกในการควบคุมการเข้าถึงวัตถุพร้อมกัน

สิ่งนี้ช่วยให้คุณทำ:

หัวข้อที่ 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

หัวข้อที่ 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

ซึ่งจะป้องกันไม่ให้เธรด 1 และ 2 เข้าถึงส่วนที่ตรวจสอบ (ซิงโครไนซ์) ในเวลาเดียวกัน หนึ่งจะเริ่มต้นและการตรวจสอบจะป้องกันไม่ให้อีกคนเข้าถึงภูมิภาคก่อนที่อันแรกจะเสร็จสิ้น

ไม่ใช่วัตถุพิเศษ java.lang.Objectกลไกการประสานของมันอยู่ที่รากลำดับชั้น:

นอกจากนี้ยังมีwaitและnotifyวิธีการที่จะใช้จอภาพของวัตถุเพื่อสื่อสารระหว่างเธรดต่างๆ


1
ดังนั้นเราสามารถพูดได้ว่าเมื่อเราสร้างเมธอดซิงโครไนซ์เรากำลังกำหนดล็อค (มอนิเตอร์) บนเมธอดของอ็อบเจ็กต์นั้น?
xdevel2000

28
เอิ่มไม่เป๊ะ แต่ละวัตถุจะมีจอภาพ (mutex) เชื่อมโยงโดยอัตโนมัติโดยไม่คำนึงถึงสิ่งอื่นใด เมื่อคุณประกาศเมธอดที่ซิงโครไนซ์คุณกำลังประกาศว่ารันไทม์ต้องได้รับการล็อกบนมอนิเตอร์ของอ็อบเจ็กต์ก่อนที่จะเริ่มการทำงานของเมธอดนั้น (และต้องคลายการล็อกก่อนที่การควบคุมจะกลับไปที่รหัสการเรียก)
Andrzej Doyle

31
และ @Pablo - ไม่มีสิ่งที่เรียกว่าจอภาพสำหรับวิธีการ มอนิเตอร์มีอยู่สำหรับอ็อบเจ็กต์เท่านั้นซึ่งจะเป็นอินสแตนซ์ที่ปิดล้อมสำหรับเมธอดส่วนใหญ่หรือClassอ็อบเจ็กต์ที่เกี่ยวข้องสำหรับเมธอดแบบคงที่ หากคุณมี method1 () ที่ซิงโครไนซ์อยู่แล้วและคุณประกาศว่า method2 () ซิงโครไนซ์จะไม่มีการสร้างจอภาพใหม่ขึ้นมาและในความเป็นจริงแล้วการเรียกใช้วิธีใดวิธีหนึ่ง (บนวัตถุเดียวกัน) จะพยายามล็อกจอภาพเดียวกัน สิ่งนี้มักจะดึงดูดผู้มาใหม่
Andrzej Doyle

1
@Andrzej: ดังนั้นทุกวัตถุมีหนึ่งจอภาพที่เกี่ยวข้อง จากนั้นฉันสามารถมีวิธีการซิงโครไนซ์ได้หลายวิธี หลังจากนั้นเมื่อใดก็ตามที่ใช้วิธีการนั้นเธรดจะเรียกมันว่าได้รับจอภาพนั้นที่ทำข้อมูลให้ตรงกัน
xdevel2000

1
เพียงแค่ต้องชี้แจงสิ่งนี้ ... วัตถุที่ใช้ในการเรียกบล็อกที่ซิงโครไนซ์ในเธรด 1 สามารถใช้อีกครั้งในเธรดอื่น (เธรด 2) เพื่อเรียกใช้เมธอดปกติ (ไม่ซิงโครไนซ์) ในเวลาเดียวกัน?

27

จอภาพเป็นนิติบุคคลที่มีคุณสมบัติทั้งหนึ่งล็อคและชุดรอ ใน Java Objectสามารถใช้เป็นจอภาพได้

สำหรับคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานของจอภาพใน Java ฉันขอแนะนำให้อ่านส่วนMonitor Mechanicsของการเขียนโปรแกรมพร้อมกันใน Java (ลิงก์ก่อนหน้านี้แสดงตัวอย่างใน Google หนังสือและส่วนนั้นพร้อมให้อ่าน)


ดังที่คุณกล่าวว่า "จอภาพเป็นเอนทิตี .. " หมายความว่าจอภาพเป็นวัตถุ / สถานะภายในซึ่งครอบครอง / ติดตามการล็อกและรอหรือไม่? ถ้าไม่ได้โปรดอธิบายรายละเอียดของเอนทิตีที่นี่ได้ไหม โดยทั่วไปเมื่อเรา java doc พูดWakes up all threads that are waiting on this object's monitor. เกี่ยวกับการแจ้งเตือน () สิ่งที่ฉันได้รับคือการบำรุงรักษาวัตถุ (ด้วยความช่วยเหลือของเอนทิตี / วัตถุภายใน) สิ่งที่เธรดทั้งหมดกำลังรอการล็อกเอนทิตี / อ็อบเจ็กต์ภายในนั้นเรียกว่ามอนิเตอร์?
user3198603

คำตอบที่มีประโยชน์ที่สุด ขอบคุณ @JRL
gravetii

สำหรับฉันมันบอกว่า: "ไม่มีตัวอย่างสำหรับหน้านี้"
opncow

9
  1. จอภาพเป็นแนวคิด / กลไกที่ไม่ จำกัด เฉพาะภาษา Java
  2. "ในการเขียนโปรแกรมพร้อมกันจอภาพเป็นวัตถุหรือโมดูลที่ตั้งใจให้ใช้งานได้อย่างปลอดภัยโดยมากกว่าหนึ่งเธรด";
  3. อย่างที่ผู้อ่านทุกคนทราบทุก object ใน Java เป็นคลาสย่อยของ java.lang.Object คนจาวาสร้าง java.lang.Object ในลักษณะที่มีคุณสมบัติและลักษณะเฉพาะที่ทำให้โปรแกรมเมอร์ Java สามารถใช้วัตถุใด ๆ เป็นจอภาพได้ ตัวอย่างเช่นทุกออบเจ็กต์มีคิวรอคิวเข้าใหม่และวิธีการรอและแจ้งเตือนทำให้เป็นจอภาพ
  4. อ่านเกี่ยวกับการตรวจสอบที่นี่

4

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



2

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

มอนิเตอร์ยังมีกลไกในการส่งสัญญาณเธรดอื่น ๆ ว่าตรงตามเงื่อนไขแล้ว เป็นหน่วยงานที่มีทั้งล็อคและชุดรอ ใน Java Object ใด ๆ สามารถใช้เป็นจอภาพได้

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

สำหรับข้อมูลเพิ่มเติมตรวจสอบลิงค์


1

http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/monitors.html

มอนิเตอร์เชื่อมโยงกับอ็อบเจ็กต์หรือสมาชิกข้อมูลซึ่งจะได้มาเมื่อมีการป้อนข้อมูลสมาชิกหรืออ็อบเจ็กต์คือบล็อกซิงโครไนซ์ (ส่วนวิกฤต) และปล่อยเมื่อออก

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