ตราประทับสองดวงบนโต๊ะมิ้นต์ดวงหนึ่งสีเขียวดวงหนึ่งสีอำพันสำหรับ validate

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 เดิม