Thread线程安全三

悲观锁和乐观锁

悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作

读悲观锁:在读悲观锁之前一定要判断一下,数据是否正在被修改

乐观锁:假设不会发生冲突,只在提交操作时检查是否违反数据完整性

读乐观锁:不需要判定数据的一致性,只管自己读

import java.util.concurrent.locks.StampedLock;

class Point{
    private double x;
    private double y;
    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();//创建一个乐观锁
        double cX,cY;
        if(!sl.validate(stamp)){//判断是否有其他写锁发生
            stamp = sl.readLock();//如果没有创建一个悲观锁来读取数据,也可以不加,最后释放锁即可
            try{
                cX = x;
                cY = y;
            }finally{
                sl.unlock(stamp);
            }
        }
        return Math.sqrt(cX*cX+cY*cY)
    }

    void moveIfAtOrigin(double newX,double newY){
        long stamp = sl.readLock();//创建一个悲观读锁
        try{
            while(x == 0.0 && y == 0.0){//检查当前状态是否符合
                long ws = sl.tryConvertToWriteLock(stamp);//将读锁转化为写锁
                if(ws !=0){
                    stamp = ws;
                    x = newX;
                    y = newY;
                }else{//不能转化为写锁
                    sl.unlock(stamp);//释放读锁
                    stamp = sl.writeLock();//显示直接进行写锁,再次尝试
                }
            }
        }finally{
            sl.unlock(stamp);//释放锁
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值