ในฐานะเครื่องมือสำหรับการแบ่งปันข้อมูลพร้อมกันและรับประกันความสอดคล้อง การล็อคมีการใช้งานหลายอย่างบนแพลตฟอร์ม JAVA (เช่น การซิงโครไนซ์และ ReentrantLock เป็นต้น) ล็อคที่เขียนไว้แล้วเหล่านี้ให้ความสะดวกในการพัฒนาของเรา แต่ไม่ค่อยมีการกล่าวถึงลักษณะเฉพาะและประเภทของล็อค บทความชุดนี้จะวิเคราะห์ชื่อล็อคทั่วไปและคุณลักษณะภายใต้ JAVA เพื่อตอบคำถามของคุณ
การปิดกั้นล็อค
การบล็อคล็อค ต่างจากการล็อคแบบหมุน เปลี่ยนสถานะการทำงานของเธรด
ในสภาพแวดล้อม JAVA เธรด Thread มีสถานะดังต่อไปนี้:
1. สถานะใหม่
2. สถานะพร้อม
3. สถานะการทำงาน
4. สถานะที่ถูกบล็อก
5. สถานะความตาย
อาจกล่าวได้ว่าการล็อคการบล็อกเพื่อให้เธรดเข้าสู่สถานะการบล็อกและรอ เมื่อได้รับสัญญาณที่เกี่ยวข้อง (การปลุก เวลา) เธรดสามารถเข้าสู่สถานะพร้อม เธรดทั้งหมดในสถานะพร้อมจะเข้าสู่สถานะกำลังทำงาน ผ่านการแข่งขัน
ใน JAVA วิธีการที่สามารถเข้า/ออก สถานะบล็อก หรือมีล็อคการบล็อก ได้แก่ คีย์เวิร์ดที่ซิงโครไนซ์ (การล็อคน้ำหนักในนั้น), ReentrantLock, Object.wait()/notify(), LockSupport.park()/unpart()( จุกใช้บ่อย)
ต่อไปนี้เป็นตัวอย่างของการล็อกการบล็อก JAVA:
ล็อคแพ็คเกจนำเข้า java.util.concurrent.atomic.AtomicReferenceFieldUpdater; นำเข้า java.util.concurrent.locks.LockSupport; คลาสสาธารณะ CLHLock1 { คลาสคงที่สาธารณะ CLHNode { เธรดระเหยส่วนตัว isLocked } @SuppressWarnings ("ไม่ได้ใช้") CLHNode ส่วนตัวระเหย tail; ThreadLocal สุดท้ายแบบคงที่ส่วนตัว LOCAL = ใหม่ ThreadLocal <CLHNode> (); AtomicReferenceFieldUpdater สุดท้ายแบบคงที่ () { โหนด CLHNode = new CLHNode (); .set(โหนด); preNode = UPDATER.getAndSet (นี่); preNode = null; ปลดล็อคเป็นโมฆะ () { โหนด CLHNode = LOCAL.get (); ถ้า (! UPDATER.compareAndSet (นี่, โหนด, null)) { System.out.println("unlock/t" + node.isLocked.getName()); LockSupport.unpark(node.isLocked); } โหนด = null;
ที่นี่เราใช้ล็อคการปิดกั้นของ LockSupport.unpark() ตัวอย่างนี้ได้รับการแก้ไขจากการล็อค CLH
ข้อดีของการบล็อคล็อคคือ เธรดที่ถูกบล็อคจะไม่กินเวลา CPU และจะไม่ทำให้ CPU ครอบครองมากเกินไป แต่เวลาเข้าและเวลาในการฟื้นตัวจะช้ากว่าการล็อคแบบหมุนเล็กน้อย
ในกรณีของการแข่งขันที่รุนแรง ประสิทธิภาพของบล็อคล็อคจะสูงกว่าสปินล็อคอย่างมาก
สถานการณ์ในอุดมคติคือ ใช้การล็อคแบบหมุนเมื่อการแข่งขันของเธรดไม่รุนแรง และใช้การล็อคการปิดกั้นเมื่อการแข่งขันที่รุนแรง
(จบข้อความฉบับเต็ม)