Reentrantlock ถูกนำไปใช้ภายในโดยอินสแตนซ์คลาสซิงค์
คลาสการซิงค์ถูกกำหนดภายใน reentrantlock
การซิงค์มาจาก Abstractqueuedsynchronizer
Abstractqueuedsynchronizer สืบทอดมาจาก Abstractownablesynchronizer
มีเพียงตัวแปร ExclusiveOnerThread เท่านั้นที่กำหนดไว้ในคลาส AbstractOwnableSynchronizer ซึ่งเป็นตัวแทนของเธรดที่เป็นเจ้าของในปัจจุบัน
นอกเหนือจากคลาส SYNC แล้ว Reentrantlock ยังกำหนดคลาสการใช้งานสองคลาสภายใน
Nonfairsync เป็นล็อคที่ไม่เป็นธรรม Fairsync เป็นล็อคที่ยุติธรรม
ทั้งสองโครงสร้างของ reentrantlock มีดังนี้:
วิธีล็อคใหม่
วิธีการล็อคที่ไม่ยุติธรรม
วิธีการเปรียบเทียบสเก็ตสเตทเป็นวิธี CAS วิธีนี้พยายามอัปเดตตัวแปรในวัตถุ ตัวแปรคาดว่าจะเป็น 0 อัปเดตเป็น 1
หากการอัปเดตสำเร็จให้ตั้งค่าตัวแปร ExclusiveNerThread เป็นเธรดปัจจุบัน จากนั้นวิธีการล็อคจะกลับมาทันที
หากการอัปเดตล้มเหลวรับ (1) เรียกว่า
ในวิธีการรับ tryacquire () เรียกว่าก่อนและพยายามอัปเดตอีกครั้ง
วิธีการล็อคที่ไม่เป็นธรรมของ Tryacquire () มีดังนี้:
วิธี NontertryAcquire () ของการล็อคที่ไม่เป็นธรรมเรียกว่าภายในโดยวิธี NonfirtryCquire ดังนี้:
หากวิธีการ tryacquire () ถูกลองอีกครั้งโดยไม่ประสบความสำเร็จ ขั้นแรกวิธี AddWaiter () จะถูกเรียกให้เพิ่มเธรดปัจจุบันไปยังคิวรอ เมธอด addwaiter ส่งคืนโหนดโหนด
หลังจากกลับไปที่โหนดแล้วได้รับ (โหนด 1) จะพยายามอัปเดตอีกครั้ง
หากการอัปเดตยังไม่สามารถอัปเดตได้เธรดจะถูกระงับผ่าน ParkandCheckInterrupt
วิธีปลดล็อคใหม่
ตรวจสอบวิธีการเปิดตัว ()
หากหัวของคิวไม่ว่างเปล่าและสถานะการรอของหัวไม่ใช่ 0 วิธีการ unparksuccessor () จะเรียกว่า
วิธี unparksuccessor () มีดังนี้:
ทำให้โหนดต่อไปสำรวจจากด้านหลังไปด้านหน้าเพื่อรับเธรดแรกในคิวด้วย waitstatus น้อยกว่า 0 จากนั้นดำเนินการต่อเธรดบนโหนด