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);
    }

    }

  • 相关阅读:
    博客收藏
    日常开发工具收藏
    2016工作总结
    REST设计规则
    spring boot 学习笔记(二) 构建web支持jsp
    数据库事务中的隔离级别和锁+spring Transactional注解
    springboot学习笔记(一)
    Python爬虫实例(四)网站模拟登陆
    Python爬虫实例(三)代理的使用
    Python爬虫实例(二)使用selenium抓取斗鱼直播平台数据
  • 原文地址:https://www.cnblogs.com/wueryuan/p/12073086.html
Copyright © 2011-2022 走看看