其他分享
首页 > 其他分享> > 读多写少的场景下,竟然还有比读写锁更牛X的锁?

读多写少的场景下,竟然还有比读写锁更牛X的锁?

作者:互联网

1)上一篇文章我们聊了读写锁,他的适用场景是读多写少的场景下,那有没有其它性能比读写锁还要牛逼的锁呢?

2)StampedLock比读写锁牛在什么地方?

3)写锁和悲观读锁与我们读写锁的细致区别是什么?

4)乐观读是怎样使用的?

 ​
 class Point {
   private int x, y;
   final StampedLock sl =
     new StampedLock();
   //计算到原点的距离  
   int distanceFromOrigin() {
     // 乐观读
     long stamp =
       sl.tryOptimisticRead();
     // 读入局部变量,
     // 读的过程数据可能被修改
     int curX = x, curY = y;
     //判断执行读操作期间,
     //是否存在写操作,如果存在,
     //则sl.validate返回false
     if (!sl.validate(stamp)){
       // 升级为悲观读锁
       stamp = sl.readLock();
       try {
         curX = x;
         curY = y;
      } finally {
         //释放悲观读锁
         sl.unlockRead(stamp);
      }
    }
     return Math.sqrt(
       curX * curX + curY * curY);
  }
 }

5)StampedLock有哪些注意事项?

6)以后有用到StampedLock的需求的时候,使用的模板应该是怎样的?

StampedLock 读模板:

 ​
 final StampedLock sl =
   new StampedLock();
 ​
 // 乐观读
 long stamp =
   sl.tryOptimisticRead();
 // 读入方法局部变量
 ......
 // 校验stamp
 if (!sl.validate(stamp)){
   // 升级为悲观读锁
   stamp = sl.readLock();
   try {
     // 读入方法局部变量
    .....
  } finally {
     //释放悲观读锁
     sl.unlockRead(stamp);
  }
 }
 //使用方法局部变量执行业务操作
 ......

StampedLock 写模板:

 ​
 long stamp = sl.writeLock();
 try {
   // 写共享变量
  ......
 } finally {
   sl.unlockWrite(stamp);
 }

 

标签:stamp,读多,读写,StampedLock,读锁,线程,sl,写少
来源: https://www.cnblogs.com/YXBLOGXYY/p/16073795.html