• 使用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);
    }

    }

  • 相关阅读:
    30+简约时尚的Macbook贴花
    20+非常棒的Photoshop卡通设计教程
    20+WordPress手机主题和插件【好收藏推荐】
    75+精美的网格网站设计欣赏
    TopFreeTheme精选免费模板【20130629】
    45个有新意的Photoshop教程和技巧
    30个高质量的旅游网站设计
    55个高质量的Magento主题,助你构建电子商务站点
    一个弹框引起的彻夜加班
    开始跟踪Redis啦,开帖
  • 原文地址:https://www.cnblogs.com/wueryuan/p/12073086.html
Copyright © 2020-2023  润新知