คำหลักที่ซิงโครไนซ์
คีย์ที่ซิงโครไนซ์สามารถแก้ไขฟังก์ชั่นและคำสั่งภายในฟังก์ชั่น ไม่ว่าจะเป็นการเพิ่มวิธีการหรือวัตถุการล็อคที่ได้มานั้นเป็นวัตถุแทนที่จะปฏิบัติต่อชิ้นส่วนของรหัสหรือฟังก์ชั่นเป็นล็อค
1. เมื่อเธรดพร้อมกันสองตัวเข้าถึงบล็อกรหัสที่ซิงโครไนซ์ (นี้) ในวัตถุเดียวกันสามารถดำเนินการได้เพียงหนึ่งเธรดในช่วงเวลาหนึ่งและเธรดอื่น ๆ สามารถเรียกใช้งานรหัสนี้ได้หลังจากที่เธรดปัจจุบันเสร็จสิ้นการดำเนินการ
2. เมื่อเธรดเข้าถึงบล็อกรหัสซิงโครไนซ์ซิงโครไนซ์ (นี้) ในวัตถุเธรดอื่น ๆ ยังสามารถเข้าถึงบล็อกรหัสอื่นที่ไม่ได้ซิงโครไนซ์ (นี้) ในวัตถุนี้
3. ควรสังเกตที่นี่ว่าเมื่อเธรดเข้าถึงบล็อกรหัสที่ซิงโครไนซ์ (นี้) ของวัตถุเธรดอื่น ๆ จะถูกบล็อกจากการเข้าถึงบล็อกรหัสที่ซิงโครไนซ์อื่น ๆ ในวัตถุนี้
4. ข้างต้นยังใช้กับบล็อกรหัสการซิงโครไนซ์อื่น ๆ นั่นคือเมื่อเธรดเข้าถึงบล็อกรหัสซิงโครไนซ์ซิงโครไนซ์ (นี้) ของวัตถุเธรดจะได้รับการล็อควัตถุของวัตถุ ยิ่งไปกว่านั้นแต่ละวัตถุ (เช่นอินสแตนซ์ของคลาส) สอดคล้องกับการล็อค มันถูกบล็อก กลไกนี้ทำให้มั่นใจได้ว่าในเวลาเดียวกันสำหรับแต่ละวัตถุส่วนใหญ่หนึ่งฟังก์ชั่นสมาชิกทั้งหมดที่ประกาศว่าซิงโครไนซ์อยู่ในสถานะปฏิบัติการ (เพราะส่วนใหญ่หนึ่งเธรดสามารถรับล็อคของวัตถุ) ดังนั้นหลีกเลี่ยงการเข้าถึงตัวแปร .
ข้อเสียของวิธีการซิงโครไนซ์:
เนื่องจากซิงโครไนซ์ล็อควัตถุที่เรียกวิธีการซิงโครไนซ์นี้นั่นคือเมื่อเธรด P1 ดำเนินการวิธีนี้ในเธรดที่แตกต่างกันพวกเขาจะสร้างการยกเว้นซึ่งกันและกันซึ่งจะบรรลุผลของการซิงโครไนซ์ แต่ควรสังเกตที่นี่ว่าวัตถุอื่นของคลาสที่เป็นของวัตถุนี้สามารถเรียกใช้วิธีนี้โดยพลการโดยเพิ่มคำหลักที่ซิงโครไนซ์ Essence ของวิธีการซิงโครไนซ์คือการใช้งานแบบซิงโครไนซ์ในการอ้างอิงวัตถุ กรณีนี้ เราจะอธิบายสถานการณ์นี้โดยละเอียดด้านล่าง:
ก่อนอื่นเรามาแนะนำวัตถุที่ถูกล็อคสองรายการด้วยคำหลักที่ซิงโครไนซ์: วัตถุและคลาส - ซิงโครไนซ์สามารถเพิ่มล็อควัตถุหรือล็อคคลาสไปยังทรัพยากร ของคลาสนี้วัตถุอื่น ๆ ของคลาสนี้ยังสามารถใช้วิธีการซิงโครไนซ์ที่ล็อควัตถุก่อนหน้า
หนึ่งในประเด็นหลักที่เราพูดถึงที่นี่คือ: "คลาสเดียวกันและอินสแตนซ์ที่แตกต่างกันจะเรียกวิธีการเดียวกันจะมีปัญหาการซิงโครไนซ์หรือไม่"
ปัญหาการซิงโครไนซ์นั้นเกี่ยวข้องกับทรัพยากรเท่านั้นและขึ้นอยู่กับว่าทรัพยากรนั้นคงที่หรือไม่ สำหรับข้อมูลคงที่เดียวกันฟังก์ชั่นเดียวกันของคุณเป็นของเธรดที่แตกต่างกันเพื่ออ่านและเขียนในเวลาเดียวกันและ CPU จะไม่สร้างข้อผิดพลาด คุณ. แม้ว่าคุณจะมีรหัสที่แตกต่างกันสองรหัสที่ทำงานในสองคอร์ที่แตกต่างกันของ CPU และเขียนที่อยู่หน่วยความจำในเวลาเดียวกันกลไกแคชจะล็อคหนึ่งใน L2 ก่อน จากนั้นอัปเดตและแชร์กับแกนอื่นและจะไม่มีข้อผิดพลาดมิฉะนั้น Intel หรือ AMD จะไร้ประโยชน์
ดังนั้นตราบใดที่คุณไม่มีทรัพยากรหรือตัวแปรเดียวกับที่แชร์รหัสสองรายการจะไม่มีข้อมูลที่ไม่สอดคล้องกัน ยิ่งไปกว่านั้นการเรียกวัตถุต่าง ๆ ในคลาสเดียวกันนั้นมีสแต็คที่แตกต่างกันอย่างสิ้นเชิงและไม่เกี่ยวข้องอย่างสมบูรณ์
ที่นี่เราใช้ตัวอย่างเพื่อแสดงกระบวนการขายตั๋วโดยที่ทรัพยากรที่ใช้ร่วมกันของเราคือจำนวนตั๋วที่เหลืออยู่
แพ็คเกจ com.test; Threatsafetest Public Class Explements Enplements Runnable {Private Static Int Num = 1; เป็นโมฆะขาย (ชื่อสตริง) {ถ้า (num> 0) {ระบบ (เสร็จสิ้นในเวลาประมาณ 5 วินาที) ; ("ระบบ: จำนวนการลงคะแนนเสียง:" + NUM); args []) {ลอง {threadsafetest ใหม่ ("ผู้ขายตั๋ว Li XX"). start (); {E.PrintStackTrace ();}}} เรียกใช้รหัสด้านบนและผลลัพธ์ที่เราได้รับคือ:
ตัวนำตั๋ว Li XX: จำนวนตั๋วทดสอบมีค่ามากกว่า 0 ตัวนำตั๋ว Li XX: การชำระเงินจะถูกรวบรวม (เสร็จสิ้นในเวลาประมาณ 5 วินาที) - - ผู้ขายตั๋ว King X: จำนวนตั๋วทดสอบมากกว่า 0 ผู้ขายตั๋ว King X: การชำระเงินจะถูกรวบรวม (เสร็จสิ้นในเวลาประมาณ 5 วินาที) - - ผู้ขายตั๋ว Li XX: พิมพ์ใบเรียกเก็บเงิน, ระบบการขายตั๋วเสร็จสมบูรณ์: จำนวนโหวตปัจจุบัน: 0 ผู้ขายตั๋ว Wang X: พิมพ์ใบเรียกเก็บเงิน, ระบบการขายตั๋วเสร็จสมบูรณ์: จำนวนโหวตปัจจุบัน: -1 คำเตือน: จำนวนคะแนนต่ำกว่า 0, ตัวเลขติดลบปรากฏขึ้น
จากผลลัพธ์ผลลัพธ์เราสามารถพบว่าคะแนนโหวตที่เหลืออยู่คือ -1 และมีปัญหาข้อผิดพลาดในการซิงโครไนซ์ เหตุผลนี้คือวัตถุอินสแตนซ์ทั้งสองที่เราสร้างได้แก้ไขทรัพยากรคงที่ที่ใช้ร่วมกัน int int num = 1 ในเวลาเดียวกัน จากนั้นเราจะลบ modifier คงที่ในกล่องในรหัสด้านบนแล้วเรียกใช้โปรแกรมเพื่อรับ:
ตัวนำตั๋ว Li XX: จำนวนตั๋วทดสอบมีค่ามากกว่า 0 ตัวนำตั๋ว Li XX: การชำระเงินจะถูกรวบรวม (เสร็จสิ้นในเวลาประมาณ 5 วินาที) - - ผู้ขายตั๋ว King X: จำนวนตั๋วทดสอบมากกว่า 0 ผู้ขายตั๋ว King X: การชำระเงินจะถูกรวบรวม (เสร็จสิ้นในเวลาประมาณ 5 วินาที) - - ผู้ขายตั๋ว Li XX: พิมพ์ใบเรียกเก็บเงินระบบการขายตั๋วเสร็จสมบูรณ์: จำนวนตั๋วปัจจุบัน: 0 ผู้ขายตั๋ว Wang X: พิมพ์ใบเรียกเก็บเงิน, ระบบขายตั๋วเสร็จสมบูรณ์: จำนวนตั๋วปัจจุบัน: 0
หลังจากปรับเปลี่ยนปริญญาแล้วโปรแกรมจะทำงานโดยไม่มีปัญหาใด ๆ แต่สิ่งนี้ขัดกับความคาดหวังของเราว่าหลายเธรดสามารถจัดการทรัพยากรที่ใช้ร่วมกันในเวลาเดียวกัน (หลังจากคงที่การเปลี่ยนแปลง NUM จากทรัพยากรที่ใช้ร่วมกันเป็นตัวแปรสมาชิกแต่ละอินสแตนซ์ที่เป็นเจ้าของ) ซึ่งไม่ใช่สิ่งที่เราต้องการ
ในสองรหัสข้างต้นสิ่งสำคัญที่จะนำมาใช้คือการล็อควัตถุ ด้วยเหตุผลที่ฉันพูดถึงก่อนหน้านี้เมื่อสองอินสแตนซ์ที่แตกต่างกันของคลาสปรับเปลี่ยนทรัพยากรที่ใช้ร่วมกันเดียวกัน CPU จะเริ่มต้นกับตรรกะของโปรแกรมหรือไม่ ดังนั้นเราจำเป็นต้องเปลี่ยนขอบเขตของการล็อค ในเวลาเดียวกัน
แพ็คเกจ com.test; Threatsafetest Public Class Explements Enplements Runnable {Private Static Int Num = 1; โมฆะคงที่ (ชื่อสตริง) {ถ้า (num> 0) {ระบบ การรวบรวมการชำระเงิน (ประมาณ 5 วินาที) ();} catch (InterruptedException E) {E.PrintStackTrace (); .println ("ระบบ: การนับคะแนนปัจจุบัน:" + num); ถ้า (num <0) {ระบบ String args []) {ลอง {threadsafetest ใหม่ ("ผู้ขายตั๋ว Li XX"). start (); ) {E.PrintStackTrace ();}}} ทำให้โปรแกรมดังกล่าวข้างต้นเพื่อรับผลการดำเนินการ:
ตัวนำตั๋ว Li XX: จำนวนตั๋วทดสอบมีค่ามากกว่า 0 ตัวนำตั๋ว Li XX: การชำระเงินจะถูกรวบรวม (เสร็จสิ้นในเวลาประมาณ 5 วินาที) - - ผู้ขายตั๋ว Li XX: พิมพ์ตั๋วระบบขายตั๋วเสร็จ: จำนวนตั๋วปัจจุบัน: 0 ผู้ขายตั๋ว Wang X: ไม่มีตั๋วหยุดขายตั๋ว
ตัวดัดแปลงแบบคงที่จะถูกเพิ่มลงในวิธีการขาย () เพื่อให้วัตถุของล็อคกลายเป็นคลาส สิ่งนี้จะได้รับผลลัพธ์ที่เราต้องการตามที่คาดไว้
สรุป:
1. มีการใช้คำหลักที่ซิงโครไนซ์สองครั้ง: วิธีการซิงโครไนซ์และบล็อกซิงโครไนซ์
2. ใน Java มันไม่ได้เป็นเพียงอินสแตนซ์ของคลาส แต่แต่ละชั้นเรียนยังสามารถสอดคล้องกับการล็อค
1. คำหลักที่ซิงโครไนซ์ไม่สามารถสืบทอดได้ แม้ว่าการซิงโครไนซ์สามารถใช้ในการกำหนดวิธีการซิงโครไนซ์ไม่ได้อยู่ในส่วนหนึ่งของคำจำกัดความของวิธีการดังนั้นคำหลักที่ซิงโครไนซ์จึงไม่สามารถสืบทอดได้ หากวิธีการในคลาสพาเรนต์ใช้คำหลักที่ซิงโครไนซ์และ subclass ยังแทนที่วิธีนี้โดยค่าเริ่มต้นวิธีนี้ในคลาสย่อยจะไม่ซิงโครไนซ์และจะต้องแสดงเพื่อเพิ่มวิธีการในคลาสย่อยเท่านั้น . แน่นอนว่าคุณสามารถเรียกวิธีการที่สอดคล้องกันในคลาสพาเรนต์ในคลาสย่อย ถูกซิงโครไนซ์ ชอบ,
เพิ่มคำหลักที่ซิงโครไนซ์ลงในคลาสย่อย:
ชั้นเรียนชั้นเรียน {วิธีการเป็นโมฆะสาธารณะที่ซิงโครไนซ์ () {}} เด็กชั้นเรียนขยายพาเรนต์ {วิธีโมฆะที่ซิงโครไนซ์สาธารณะ () {}} เรียกวิธีการคลาสแม่:
ชั้นเรียน parent {โมฆะที่ซิงโครไนซ์สาธารณะ () {}} เด็กชั้นเรียนขยายวิธีการ parent {โมฆะสาธารณะ () {super.method ();}}} 2. คำหลักที่ซิงโครไนซ์ไม่สามารถใช้เมื่อกำหนดวิธีการอินเตอร์เฟส
3. ตัวสร้างไม่สามารถใช้คำหลักที่ซิงโครไนซ์ได้ แต่บล็อกที่ซิงโครไนซ์สามารถใช้สำหรับการซิงโครไนซ์
4. ตำแหน่งที่ซิงโครไนซ์สามารถวางได้อย่างอิสระ แต่ไม่สามารถวางไว้ด้านหลังประเภทการส่งคืนของวิธีการ
5. คำหลักที่ซิงโครไนซ์ไม่สามารถใช้เพื่อซิงโครไนซ์ตัวแปรเช่นรหัสต่อไปนี้ไม่ถูกต้อง:
สาธารณะที่ซิงโครไนซ์ int n = 0;
6. แม้ว่าการใช้คำหลักที่ซิงโครไนซ์เป็นวิธีการซิงโครไนซ์ที่ปลอดภัยที่สุดหากใช้ในปริมาณมาก แต่ก็จะทำให้การใช้ทรัพยากรที่ไม่จำเป็นและการสูญเสียประสิทธิภาพ บนพื้นผิววิธีการที่ซิงโครไนซ์ล็อค แต่ในความเป็นจริงมันล็อคคลาส ดำเนินการ วิธีการคงที่คล้ายกับวิธีที่ไม่คงที่ อย่างไรก็ตามวิธีการคงที่และวิธีการที่ไม่คงที่จะไม่ส่งผลต่อกันและกันดูรหัสต่อไปนี้:
Public Class MyThread1 ขยายเมธอด {public String methodname; ");} โมฆะโมฆะแบบซิงโครไนซ์สาธารณะ () {วิธี (" วิธีการไม่คงที่ 2 วิธี ");} โมฆะโมฆะแบบสแตติกแบบคงที่สาธารณะ () {วิธี (" วิธีการแบบคงที่ 3 วิธี ");} โมฆะแบบคงที่แบบคงที่สาธารณะ ("Method4 method4"); ) ข้อยกเว้น {MyThread1 MyThread1 = New MyThread1 (); ); ผลการทำงานคือ:
วิธีการที่ไม่คงที่ 1 วิธีการวิธีการแบบคงที่ 3 วิธี
จากผลลัพธ์การรันด้านบนเราจะเห็นว่า Method2 และ Method4 จะไม่ทำงานจนกว่า Method1 และ Method3 จะเสร็จสมบูรณ์ ดังนั้นเราสามารถสรุปได้ว่าหากเราใช้การซิงโครไนซ์เพื่อกำหนดวิธีการที่ไม่คงที่ในชั้นเรียนมันจะส่งผลกระทบต่อวิธีการที่ไม่คงที่ทั้งหมดที่ซิงโครไนซ์ทั้งหมดในคลาสนี้ ในวิธีการคลาสสแตติกคลาสนี้กำหนดโดยซิงโครไนซ์ นี่เป็นเหมือนการล็อคตารางในตารางข้อมูล ดังนั้นการใช้อย่างหนักของวิธีการซิงโครไนซ์นี้จะช่วยลดประสิทธิภาพของโปรแกรมได้อย่างมาก
เคล็ดลับสำหรับการเข้าถึงทรัพยากรที่แบ่งปันที่ปลอดภัยยิ่งขึ้น:
1. กำหนดตัวแปรอินสแตนซ์ของเมธอดส่วนตัว + ของมันแทนที่จะกำหนดตัวแปรอินสแตนซ์ของสาธารณะ/การป้องกัน หากตัวแปรถูกกำหนดให้เป็นสาธารณะวัตถุสามารถรับโดยตรงข้ามการควบคุมของวิธีการซิงโครไนซ์ในโลกภายนอกและเปลี่ยนมัน นี่เป็นหนึ่งในการใช้งานมาตรฐานของ Javabean
2. หากตัวแปรอินสแตนซ์เป็นวัตถุเช่นอาร์เรย์หรืออาร์เรย์ลิสต์ดังนั้นวิธีการข้างต้นยังคงไม่ปลอดภัยเพราะเมื่อโลกภายนอกได้รับการอ้างอิงไปยังวัตถุอินสแตนซ์ผ่านวิธีการรับและชี้ไปที่วัตถุอื่น ตัวแปรส่วนตัวก็เปลี่ยนไปมันจะไม่เป็นอันตรายมากเหรอ? ในเวลานี้คุณต้องเพิ่มการซิงโครไนซ์เพื่อรับเมธอดและส่งคืนโคลน () ของวัตถุส่วนตัวนี้เท่านั้น ด้วยวิธีนี้สิ่งที่ผู้โทรได้รับเป็นเพียงการอ้างอิงถึงสำเนาวัตถุ
สามวิธีในการรับการตรวจสอบวัตถุ (ล็อค) และแจ้ง ()
ในเมธอดเธรดการโทรไปรอ () และแจ้ง () ต้องระบุวัตถุวัตถุและเธรดจะต้องมีการตรวจสอบของวัตถุวัตถุ วิธีที่ง่ายที่สุดในการตรวจสอบวัตถุคือการใช้คำหลักที่ซิงโครไนซ์กับวัตถุ หลังจากเรียกเมธอดรอ () เธรดจะปล่อยล็อควัตถุและป้อนสถานะการนอนหลับ เมื่อเธรดอื่นเรียกวิธีการแจ้งเตือน () วัตถุวัตถุเดียวกันจะต้องใช้
สำหรับหลายวิธีที่ถูกล็อคโดยวัตถุหนึ่งในนั้นจะถูกเลือกให้ตื่นขึ้นมาเมื่อเรียกใช้วิธีการแจ้งเตือน () และแจ้งเตือน () จะปลุกเธรดที่รอคอยทั้งหมด
Package.mindview.util; นำเข้า Javax.swing.jframe; Waitandnotify Public Class {Public Static Void Main (String [] args) {ระบบ Frame.SetDefaultCloseoperation (JFrame. exit_on_close); 300, 100); {T = ใหม่ WaitandNotifyThread (Waitandnotifyjframe. นี่); .Add (เริ่มต้น); Jbutton Pause = new JButton (ใหม่นามธรรม ("หยุดชั่วคราว") {โมฆะสาธารณะ actionperformed (actionEvent E) {ถ้า (t! = null) {t. iswait = true;}}}); (หยุดชั่วคราว); .Add (สิ้นสุด); = F; if (iswait) wait (); เช่นเดียวกับในรหัสในกล่องตัวอย่างด้านบนหากลบบล็อกรหัสซิงโครนัสการดำเนินการจะส่ง java.lang.illegalmonitorstateException
เมื่อดูที่ JDK เราจะเห็นว่าเหตุผลสำหรับข้อยกเว้นนี้คือเธรดปัจจุบันไม่ใช่เจ้าของจอภาพวัตถุนี้
วิธีนี้ควรเรียกโดยเธรดที่เป็นเจ้าของของการตรวจสอบวัตถุนี้
1. โดยการดำเนินการวิธีการอินสแตนซ์แบบซิงโครนัสของวัตถุนี้เช่น:
เป็นโมฆะที่ซิงโครไนซ์สาธารณะ n () {notify (); 2. โดยการดำเนินการเนื้อหาของคำสั่งซิงโครไนซ์ที่ซิงโครไนซ์กับวัตถุนี้เช่น:
โมฆะสาธารณะ n () {ซิงโครไนซ์ (นี้) {แจ้ง (); 3. สำหรับวัตถุประเภทคลาสคุณสามารถเรียกใช้วิธีการแบบซิงโครนัสแบบซิงโครนัสของคลาสนี้
เมื่อเรียกวิธีการคงที่เราไม่จำเป็นต้องสร้างวัตถุอินสแตนซ์ ดังนั้นสิ่งนี้ไม่สามารถใช้ในการซิงโครไนซ์วิธีการคงที่ดังนั้นวัตถุคลาสจะต้องใช้เพื่อซิงโครไนซ์วิธีการคงที่ อีกตัวอย่างหนึ่งในการอธิบาย:
คลาสสาธารณะที่ซิงโครไนซ์สแตติกใช้งานได้ {ธงบูลีนแบบคงที่ส่วนตัว = true; // วิธีการซิงโครไนซ์วัตถุคลาสหนึ่ง: // ให้ความสนใจกับวิธีการซิงโครไนซ์ของการปรับเปลี่ยนแบบคงที่, จอภาพ: synchronizedstatic.class i = 0; // วิธีการซิงโครไนซ์วัตถุคลาส 2: โมฆะส่วนตัว testsyncBlock () {// display ใช้คลาสรับเป็นจอภาพ มันเหมือนกับวิธีที่ซิงโครไนซ์แบบคงที่จะได้รับการตรวจสอบคลาส ซิงโครไนซ์ (synchronizedstatic. class) {สำหรับ (int i = 0; i <100; i ++) {ลอง {เธรด ("TestsyncBlock:" + i); ดังนั้นเธรดที่แตกต่างกันจะดำเนินการวิธีการที่แตกต่างกันและในวิธีนี้คุณจะเห็นเอฟเฟกต์การล็อคที่แตกต่างกัน if (Flag) {Flag = False; = ใหม่ SynchronizedStatic (); รหัสด้านบนเรียกใช้ผลลัพธ์ของการเรียกใช้สองวิธีในการพิมพ์ตัวเลข 100 หมายเลขจาก 0 ถึง 99 ในเวลาเดียวกัน บล็อก ทั้งสองวิธีคล้ายกัน เนื่องจากขอบเขตของวิธีการหนึ่งและวิธีการที่สองเป็นทั้งสองคลาสพวกเขาจึงเป็นเอกสิทธิ์เฉพาะบุคคล ดังนั้นผลการทำงานของโปรแกรมจะเป็น:
TestsyncMethod: 0TestsyncMethod: 1 ... ... TestsyncMethod: 99TestSyncBlock: 0 ... ... TestsyncBlock: 99
อย่างไรก็ตามหากเราแทนที่ SynchronizedStatic
testsyncBlock: 0TestSyncMethod: 0TestSyncBlock: 1TestSyncMethod: 1 ...
มีสองขอบเขตของล็อคหนึ่งคือวัตถุของชั้นเรียนและอีกอันคือคลาสของตัวเอง ในรหัสข้างต้นมีสองวิธีในการสร้างขอบเขตของคลาสล็อค A เพื่อให้การซิงโครไนซ์สามารถทำได้ระหว่างวัตถุต่าง ๆ ของคลาสเดียวกัน
ในการสรุปข้อสรุปด้านบนจะต้องมีการบันทึกประเด็นต่อไปนี้:
1. รอ (), แจ้ง () และแจ้งเตือน () ทั้งหมดจำเป็นต้องดำเนินการภายใต้หลักฐานของการตรวจสอบวัตถุมิฉะนั้น java.lang.illegalmonitorstateException จะถูกโยนลง
2. หลายเธรดสามารถรอหนึ่งวัตถุในเวลาเดียวกัน
3. แจ้ง () คือการสุ่มปลุกเธรดที่รออยู่บนวัตถุ
4. เธรดที่ถูกปลุกด้วยการแจ้งเตือน () จะไม่ตื่นขึ้นมาทันทีหลังจากการแจ้งเตือน () ถูกดำเนินการ แต่หลังจากเธรดแจ้ง () จะปล่อยมอนิเตอร์วัตถุ
5. วิธีการของวัตถุเหล่านี้ยังห่างไกลจากการนอนหลับและวิธีการขัดจังหวะของเธรดดังนั้นอย่าสับสน