ReentrantLockเป็นที่ไม่มีโครงสร้างซึ่งแตกต่างจากsynchronized
โครงสร้าง - คือคุณไม่จำเป็นต้องใช้โครงสร้างบล็อกสำหรับล็อคและยังสามารถถือล็อคทั่ววิธี ตัวอย่าง:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
การไหลดังกล่าวเป็นไปไม่ได้ที่จะแสดงผ่านจอภาพเดียวในsynchronized
โครงสร้าง
นอกเหนือจากที่ReentrantLock
สนับสนุนล็อคเลือกตั้งและล็อค Interruptible รอว่าการสนับสนุนการหมดเวลา ReentrantLock
นอกจากนี้ยังมีการสนับสนุนสำหรับนโยบายความเป็นธรรมที่สามารถกำหนดค่าได้ช่วยให้การกำหนดตารางเวลาเธรดมีความยืดหยุ่นมากขึ้น
ตัวสร้างสำหรับคลาสนี้ยอมรับพารามิเตอร์fairness ที่เป็นทางเลือก เมื่อตั้งค่าtrue
ภายใต้การช่วงชิงล็อคจะอนุญาตให้เข้าถึงเธรดที่รอคอยนานที่สุด มิฉะนั้นการล็อคนี้จะไม่รับประกันการเข้าถึงคำสั่งใด ๆ โปรแกรมที่ใช้การล็อกที่ยุติธรรมที่เข้าถึงได้โดยเธรดจำนวนมากอาจแสดงปริมาณงานโดยรวมที่ต่ำกว่า (เช่นช้ากว่ามักช้ากว่า) ที่ใช้การตั้งค่าเริ่มต้น แต่มีความแปรปรวนน้อยกว่า อย่างไรก็ตามโปรดทราบว่าความเป็นธรรมของการล็อคไม่รับประกันความเป็นธรรมของการจัดตารางเวลาเธรด ดังนั้นหนึ่งในหลาย ๆ เธรดที่ใช้การล็อคแบบยุติธรรมอาจได้รับหลาย ๆ ครั้งติดต่อกันในขณะที่เธรดที่ใช้งานอยู่อื่น ๆ ไม่คืบหน้าและไม่ได้ล็อคการล็อคไว้ ยังทราบว่า untimedtryLock
วิธีการไม่ให้เกียรติการตั้งค่าความเป็นธรรม มันจะประสบความสำเร็จถ้าล็อคพร้อมใช้งานแม้ว่าเธรดอื่นกำลังรออยู่
ReentrantLock
อาจยังจะขยายขีดความสามารถมากขึ้น , การดีมากภายใต้การแข่งขันที่สูงขึ้น คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่
อย่างไรก็ตามการอ้างสิทธิ์นี้ถูกโต้แย้ง ดูความคิดเห็นต่อไปนี้:
ในการทดสอบการล็อก reentrant การล็อกใหม่จะถูกสร้างขึ้นในแต่ละครั้งดังนั้นจึงไม่มีการล็อกแบบเอกสิทธิ์เฉพาะบุคคลและข้อมูลที่ได้จะไม่ถูกต้อง นอกจากนี้ลิงก์ IBM ยังไม่มีซอร์สโค้ดสำหรับเกณฑ์มาตรฐานดังนั้นจึงเป็นไปไม่ได้ที่จะระบุว่าการทดสอบนั้นดำเนินการอย่างถูกต้องหรือไม่
เมื่อคุณควรใช้ReentrantLock
หรือไม่? ตามบทความ developerWorks นั้น ...
คำตอบนั้นง่ายมาก - ใช้เมื่อคุณต้องการบางสิ่งที่มันจัดหาให้ซึ่งsynchronized
ไม่ได้เช่นล็อคหมดเวลารอล็อคขัดจังหวะรอล็อคไม่ล็อคโครงสร้างโครงสร้างตัวแปรเงื่อนไขหลายหรือโพลล์ล็อค ReentrantLock
ยังมีประโยชน์ในการปรับขยายได้และคุณควรใช้มันหากคุณมีสถานการณ์ที่แสดงถึงความขัดแย้งสูง แต่จำไว้ว่าsynchronized
บล็อกส่วนใหญ่แทบจะไม่เคยแสดงความขัดแย้งใด ๆ เลย ฉันจะแนะนำให้พัฒนาด้วยการซิงโครไนซ์จนกว่าการซิงโครไนซ์จะได้รับการพิสูจน์แล้วว่าไม่เพียงพอแทนที่จะเพียงแค่สมมติว่า "ประสิทธิภาพจะดีขึ้น" ถ้าคุณใช้ReentrantLock
. จำไว้ว่านี่เป็นเครื่องมือขั้นสูงสำหรับผู้ใช้ขั้นสูง (และผู้ใช้ขั้นสูงอย่างแท้จริงมักจะชอบเครื่องมือที่ง่ายที่สุดที่พวกเขาสามารถหาได้จนกว่าพวกเขาจะมั่นใจว่าเครื่องมือง่าย ๆ นั้นไม่เพียงพอ) เช่นเคยทำให้มันถูกต้องก่อนแล้วจึงกังวลว่าคุณจะต้องทำให้เร็วขึ้นหรือไม่