2021/07/18  阅读：50  主题：蓝莹

# StampedLock，一种比读写锁更快的锁！

## StampedLock三种锁模式

``public class StampedLockDemo{    //创建StampedLock锁对象    public StampedLock stampedLock = new StampedLock();        //获取、释放读锁    public void testGetAndReleaseReadLock(){        long stamp = stampedLock.readLock();        try{            //执行获取读锁后的业务逻辑        }finally{            //释放锁            stampedLock.unlockRead(stamp);        }    }        //获取、释放写锁    public void testGetAndReleaseWriteLock(){        long stamp = stampedLock.writeLock();        try{            //执行获取写锁后的业务逻辑。        }finally{            //释放锁            stampedLock.unlockWrite(stamp);        }    }}``

``class Point {    private double x, y;    private final StampedLock sl = new StampedLock();    void move(double deltaX, double deltaY) { // an exclusively locked method        long stamp = sl.writeLock();        try {            x += deltaX;            y += deltaY;        } finally {            sl.unlockWrite(stamp);        }    }    double distanceFromOrigin() { // A read-only method        long stamp = sl.tryOptimisticRead();        double currentX = x, currentY = y;        if (!sl.validate(stamp)) {            stamp = sl.readLock();            try {                currentX = x;                currentY = y;            } finally {                sl.unlockRead(stamp);            }        }        return Math.sqrt(currentX * currentX + currentY * currentY);    }    void moveIfAtOrigin(double newX, double newY) { // upgrade        // Could instead start with optimistic, not read mode        long stamp = sl.readLock();        try {            while (x == 0.0 && y == 0.0) {                long ws = sl.tryConvertToWriteLock(stamp);                if (ws != 0L) {                    stamp = ws;                    x = newX;                    y = newY;                    break;                }                else {                    sl.unlockRead(stamp);                    stamp = sl.writeLock();                }            }        } finally {            sl.unlock(stamp);        }    }}``

``double distanceFromOrigin() { // A read-only method    //乐观读    long stamp = sl.tryOptimisticRead();    double currentX = x, currentY = y;    //判断是否有线程对变量进行了写操作    //如果有线程对共享变量进行了写操作    //则sl.validate(stamp)会返回false    if (!sl.validate(stamp)) {        //将乐观读升级为悲观读锁        stamp = sl.readLock();        try {            currentX = x;            currentY = y;        } finally {            //释放悲观锁            sl.unlockRead(stamp);        }    }    return Math.sqrt(currentX * currentX + currentY * currentY);}``

## StampedLock实现思想

StampedLock内部是基于CLH锁实现的，CLH是一种自旋锁，能够保证没有“饥饿现象”的发生，并且能够保证FIFO（先进先出）的服务顺序。

``while (pred.locked) {    //省略操作 }``

StampedLock的实现思想总体来说，还是比较简单的，这里就不展开讲了。

## StampedLock的注意事项

StampedLock不支持重入

StampedLock不支持条件变量

StampedLock使用不当会导致CPU飙升

``public void testStampedLock() throws Exception{    final StampedLock lock = new StampedLock();    Thread thread01 = new Thread(()->{        // 获取写锁        lock.writeLock();        // 永远阻塞在此处，不释放写锁        LockSupport.park();    });    thread01.start();    // 保证thread01获取写锁    Thread.sleep(100);    Thread thread02 = new Thread(()->                           //阻塞在悲观读锁                           lock.readLock()                          );    thread02.start();    // 保证T2阻塞在读锁    Thread.sleep(100);    //中断线程thread02    //会导致线程thread02所在CPU飙升    thread02.interrupt();    thread02.join();}``

• NEW：初始状态，线程被构建，但是还没有调用start()方法。
• RUNNABLE：可运行状态，可运行状态可以包括：运行中状态和就绪状态。
• BLOCKED：阻塞状态，处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized。
• WAITING：表示等待状态，处于该状态的线程需要等待其他线程对其进行通知或中断等操作，进而进入下一个状态。
• TIME_WAITING：超时等待状态。可以在一定的时间自行返回。
• TERMINATED：终止状态，当前线程执行完毕。

2021/07/18  阅读：50  主题：蓝莹