StampedLock
标签:Java并发

StampedLock

StampedLock是Java8新引入的,读写锁虽然能保证读读并发,但是读锁会完全阻碍写锁,它使用的是悲观的策略,如果有大量读线程,可能会使读锁饥饿。

StampedLock采用一种乐观读的策略。

public class Point {
    private double x,y;
//    定义StampedLock锁
    private final StampedLock sl=new StampedLock();

    void move(double deltaX,double deltaY){
//        申请写锁
        long stamp=sl.writeLock();
        try {
            x+=deltaX;
            y+=deltaY;
        }finally {
            sl.unlock(stamp);
        }
    }

    double distanceFromOrigin(){
//        试图尝试一次乐观读,返回一个类似时间戳的整数
        long stamp=sl.tryOptimisticRead();
//        读取x,y的值,当然读取的时候,可能会被其他线程修改
        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);
    }
}
  • 1 min read

CONTRIBUTORS


  • 1 min read