มีสองวิธีในการล็อกทรัพยากรที่ใช้ร่วมกันโดยหลายเธรด หนึ่งคือ Reentrant Lock (หรือ ReadWriteLock ) และอีกอันโดยใช้วิธีการซิงโครไนซ์
มีการจัดคลาส ReentrantLock ในแพ็คเกจ Java concurrency จาก Java 5
มันคือการนำส่วนต่อประสานล็อคมาใช้ และตามเอกสารจาวา การใช้งานส่วนต่อประสานการล็อกนั้นให้การดำเนินการที่ครอบคลุมมากกว่าที่จะได้รับโดยใช้วิธีการซิงโครไนซ์
ซีเนียร์ เลขที่ | คีย์ | ReentrantLock | ซิงโครไนซ์ |
---|---|---|---|
1 | รับ Lock | Reentrant lock class จัดเตรียมวิธี lock() เพื่อรับการล็อคบนทรัพยากรที่ใช้ร่วมกันโดย thread | คุณต้องเขียนคีย์เวิร์ดที่ซิงโครไนซ์เพื่อรับกุญแจ |
2 | ปลดล็อค | ในการปลดล็อค โปรแกรมเมอร์ต้องเรียก Unlock() method | ทำโดยปริยาย |
3 | ความสามารถในการขัดจังหวะ | lockInterruptibly() สามารถใช้เพื่อขัดจังหวะ thread | ไม่มีทางที่จะขัดจังหวะเธรดได้ |
4 | ความเป็นธรรม | ตัวสร้างของคลาสนี้มีพารามิเตอร์ความเป็นธรรม หากตั้งค่าเป็น True จะล็อกความโปรดปรานในการให้สิทธิ์การเข้าถึงที่รอนานที่สุด * เกลียว | การล็อกไม่รับประกันการเข้าถึงคำสั่งใด ๆ |
5 | ล็อกลำดับการเปิดตัว | ปลดล็อคได้ทุกลำดับ | การล็อกควรถูกปล่อยในลำดับเดียวกับที่ได้มา |
ตัวอย่าง ReentrantLock
public class ReentrantLockExample implements Runnable{ private Lock lock=new ReentrantLock(); @Override public void run() { try { lock.lock() //Lock some resource } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }
ตัวอย่าง SynchronizedLock
public class SynchronizedLockExample implements Runnable{ @Override public void run() { synchronized (resource) { //Lock some resource } } }