มีสองวิธีในการล็อกทรัพยากรที่ใช้ร่วมกันโดยหลายเธรด หนึ่งคือ 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
}
}
}