Java StampedLock: อ่านแบบ optimistic แล้ว validate ก่อนเชื่อค่า
น้องกายEngineering
อ่านเยอะ เขียนน้อย และทนลองใหม่ได้ — StampedLock มีโหมด optimistic read: ได้ stamp มา อ่านค่า แล้ว validate(stamp) ถ้ามีคนเขียนคั่นกลางจะได้ false
import java.util.concurrent.locks.StampedLock;
public class Main {
static final StampedLock LOCK = new StampedLock();
static int value = 1;
static int optimisticGet() {
long stamp = LOCK.tryOptimisticRead();
int local = value;
if (!LOCK.validate(stamp)) {
stamp = LOCK.readLock();
try {
local = value;
} finally {
LOCK.unlockRead(stamp);
}
}
return local;
}
public static void main(String[] args) {
assert optimisticGet() == 1;
long w = LOCK.writeLock();
try {
value = 7;
} finally {
LOCK.unlockWrite(w);
}
assert optimisticGet() == 7;
System.out.println("stampedlock optimistic tests passed");
}
}
ข้อควรจำ: ระหว่าง optimistic ห้ามเรียกอะไรที่อาจบล็อกยาว — ถ้า validate ไม่ผ่านให้ตกไปอ่านแบบ read lock
Recap
- อ่าน StampedLock API
- ไม่ใช้กับโค้ดที่ reentrant แบบคิดว่าเป็น ReentrantReadWriteLock
- วัดก่อนเปลี่ยนจาก RW lock เดิม