zoukankan      html  css  js  c++  java
  • 使用StampedLock

    /**

    * StampedLock和ReadWriteLock相比,改进之处在于:读的过程中也允许获取写锁后写入!这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种乐观锁。
    * 乐观锁的意思就是乐观地估计读的过程中大概率不会有写入,因此被称为乐观锁。
    * 悲观锁则是读的过程中拒绝有写入,也就是写入必须等待。
    * 显然乐观锁的并发效率更高,但一旦有小概率的写入导致读取的数据不一致,需要能检测出来,再读一遍就行。
    * StampedLock提供了乐观读锁,可取代ReadWriteLock以进一步提升并发性能;
    * StampedLock是不可重入锁,不能在一个线程中反复获取同一个锁
    */

    class TestStampedLock{
    private final StampedLock stampedLock = new StampedLock();
    private Double x;
    private Double y;

    public void move(Double x1,Double y1){
    Long stamp = stampedLock.writeLock();// 获取写锁
    try {
    x += x1;
    y += y1;
    } finally {
    stampedLock.unlockWrite(stamp);//释放写锁
    }
    }

    public Double distanceFromOrigin(){
    //获取一个乐观读锁 
    long stamp = stampedLock.tryOptimisticRead();//有竞争返回0

    Double currentX = x;
    Double currentY = y;
    //如果在发行给定的戳记时未独占获取锁,则返回true。
    //如果stamp为零,则始终返回false。
    //如果戳记表示正确持有的锁,则始终返回true。
    if(!stampedLock.validate(stamp)){
    stamp = stampedLock.readLock();//获取悲观读锁
    try {
    currentX = x;
    currentY = y;
    } finally {
    stampedLock.unlockRead(stamp);//释放悲观读锁
    }
    }
    //返回正确舍入的双精度值的正平方根
    return Math.sqrt(currentX*currentX + currentY*currentY);
    }

    }

  • 相关阅读:
    第51月第8天 nsdata分割
    第50月第25天 TestFlight不可用
    第50月第16日 licode libnice owt
    第50月第13天 webrtc抗丢包与带宽自适应
    第50月第12天 LiveVideoStack
    第50月第3天 webrtc fec
    第49月第29天 WebRTC GN构建工具的使用
    第49月第20天 在Mac OS X上.dylib和.so之间的区别
    iOS开发总结(A0)- make table view more responsive
    iOS开发总结(A0)- block基础知识
  • 原文地址:https://www.cnblogs.com/wueryuan/p/12073086.html
Copyright © 2011-2022 走看看