ในตัวอย่างเมธอด A และ methodB เป็นเมธอดอินสแตนซ์ (ตรงข้ามกับเมธอดแบบสแตติก) วางsynchronized
เมธอดอินสแตนซ์หมายความว่าเธรดจะต้องได้รับการล็อก ("การล็อคอินทริน") บนอินสแตนซ์ของวัตถุที่เมธอดถูกเรียกใช้ก่อนที่เธรดจะเริ่มการเรียกใช้โค้ดใด ๆ ในเมธอดนั้น
หากคุณมีวิธีการอินสแตนซ์ที่แตกต่างกันสองวิธีที่ทำเครื่องหมายว่ามีการซิงโครไนซ์และเธรดที่แตกต่างกันกำลังเรียกใช้วิธีการเหล่านั้นพร้อมกันบนวัตถุเดียวกันเธรดเหล่านั้นจะโต้แย้งสำหรับการล็อกเดียวกัน เมื่อหนึ่งเธรดได้รับการล็อคเธรดอื่น ๆ ทั้งหมดจะถูกปิดจากวิธีการทำข้อมูลให้ตรงกันทั้งหมดในวัตถุนั้น
เพื่อให้ทั้งสองวิธีการทำงานพร้อมกันพวกเขาจะต้องใช้ล็อคที่แตกต่างกันเช่นนี้
class A {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
//method A
}
}
public void methodB() {
synchronized(lockB) {
//method B
}
}
}
โดยที่ไวยากรณ์บล็อกที่ซิงโครไนซ์อนุญาตให้ระบุวัตถุเฉพาะที่เธรดการเรียกใช้งานจำเป็นต้องได้รับการล็อคที่แท้จริงเพื่อเข้าสู่บล็อก
สิ่งสำคัญที่ต้องเข้าใจคือแม้ว่าเราจะใส่คีย์เวิร์ด "ซิงโครไนซ์" ในแต่ละวิธี แต่แนวคิดหลักคือล็อคที่แท้จริงภายในเบื้องหลัง
นี่คือวิธีที่การสอน Javaอธิบายความสัมพันธ์:
การซิงโครไนซ์ถูกสร้างขึ้นรอบ ๆ เอนทิตีภายในที่เรียกว่าการล็อคภายในหรือการล็อคจอภาพ (ข้อมูลจำเพาะ API มักจะอ้างถึงเอนทิตีนี้เพียงแค่เป็น "มอนิเตอร์") การล็อกที่แท้จริงมีบทบาทในการซิงโครไนซ์ทั้งสองด้าน: บังคับใช้การเข้าถึงเอกสิทธิ์ของสถานะของวัตถุและสร้างความสัมพันธ์ก่อนเกิดขึ้น
วัตถุทุกชิ้นมีการล็อคที่แท้จริงที่เกี่ยวข้อง โดยการประชุมเธรดที่ต้องการการเข้าถึงแบบเอกสิทธิ์เฉพาะบุคคลและสอดคล้องกับเขตข้อมูลของวัตถุจะต้องได้รับการล็อคที่แท้จริงของวัตถุก่อนที่จะเข้าถึงพวกเขาแล้วปล่อยล็อคที่แท้จริงเมื่อมันทำกับพวกเขา มีการกล่าวถึงเธรดเพื่อให้เป็นเจ้าของการล็อคที่แท้จริงระหว่างเวลาที่ได้รับการล็อคและปลดล็อค ตราบใดที่เธรดเป็นเจ้าของการล็อคที่แท้จริงไม่มีเธรดอื่นสามารถรับการล็อคเดียวกัน เธรดอื่นจะบล็อกเมื่อพยายามรับการล็อก
วัตถุประสงค์ของการล็อคคือการปกป้องข้อมูลที่ใช้ร่วมกัน คุณจะใช้การล็อกแยกต่างหากตามที่แสดงในรหัสตัวอย่างด้านบนเฉพาะเมื่อการล็อกแต่ละล็อกป้องกันข้อมูลสมาชิกที่แตกต่าง