Lock(), UnLock(), ReentrantLock(), TryLock() คืออะไร และแตกต่างจาก Synchronized Block ใน Java อย่างไร]

เผยแพร่แล้ว: 2020-07-05

ในบทช่วยสอนนี้ เราจะพูดถึง Lock(), UnLock(), ReentrantLock(), TryLock() และความแตกต่างจาก Synchronized Block ใน Java

หากคุณมีคำถามด้านล่างแสดงว่าคุณมาถูกที่แล้ว

  • ล็อคใน Java
  • ตัวอย่าง Java Lock และ Concurrency Lock เทียบกับการซิงโครไนซ์
  • บทช่วยสอนการทำงานพร้อมกันของ Java – Reentrant Locks
  • การซิงโครไนซ์ – การใช้การล็อก/ปลดล็อกอย่างเหมาะสมสำหรับ Java
  • java – การซิงโครไนซ์กับ Lock
  • ตัวอย่างการปลดล็อกจาวาล็อค
  • กลไกการล็อคใน java
  • จาวาล็อคปลดล็อคเธรดที่แตกต่างกัน

มาเริ่มกันเลย. อันดับแรก มาทำความเข้าใจคำศัพท์แต่ละคำกันก่อน จากนั้นเราจะมาดูตัวอย่างการทำงานกัน

ล็อค():

java.util.concurrent.locks . ล็อกเป็นกลไกการซิงโครไนซ์เธรด เช่น บล็อกที่ซิงโครไนซ์ ยกเว้นการล็อกอาจซับซ้อนกว่าบล็อกที่ซิงโครไนซ์ของ Java เป็นอินเทอร์เฟซและคลาสที่จัดเตรียมกรอบงานสำหรับการล็อกและรอเงื่อนไขที่แตกต่างจากการซิงโครไนซ์ในตัวและการมอนิเตอร์

ปลดล็อค():

UnLock() ปลดล็อคบน Object

ReentrantLock():

ReentrantLock เป็น ของเธรดล่าสุดที่ล็อกได้สำเร็จ แต่ยังไม่ได้ปลดล็อก lock ที่เรียกใช้เธรดจะส่งคืน โดยได้รับล็อกสำเร็จ เมื่อเธรดอื่นไม่ได้เป็นเจ้าของการล็อก เมธอดจะส่งคืนทันทีหากเธรดปัจจุบันเป็นเจ้าของการล็อกอยู่แล้ว

TryLock():

TryLock() จะได้รับล็อคก็ต่อเมื่อว่างในขณะที่ร้องขอ

เคล็ดลับ-1

หากคุณเพียงแค่ล็อกวัตถุ ฉันต้องการใช้ synchronized.

ในขณะที่ซิงโครไนซ์ มันชัดเจนมากและเป็นไปไม่ได้ที่จะผิดพลาด:

รายละเอียดตัวอย่าง:

  1. สร้างคลาส: CrunchifyLockTutorial.java
  2. สร้างคลาสภายใน: บริษัท และ CrunchifyLoop
  3. จาก Main สร้างสองวัตถุของคลาส Company
  4. เริ่มการวนซ้ำของเธรดสำหรับ 10 บนอ็อบเจ็กต์เหล่านั้น
  5. ในขณะที่ Company1 คุยกับ Company2 – มันล็อคอ็อบเจกต์ หากในเวลาเดียวกัน – หาก Company2 ต้องการพูดคุยกับ Company1 จะมีข้อความว่า – Conflicting – Lock มีอยู่แล้ว (ทั้งสองบริษัทอยู่ระหว่างการเจรจา)

เอาท์พุท:

เคล็ดลับ-2

คุณสามารถบรรลุทุกสิ่งที่ยูทิลิตี้ใน java.util.concurrent ทำกับ primitives ระดับต่ำ เช่น synchronized , volatile หรือ wait