悲观锁和乐观锁
悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作
读悲观锁:在读悲观锁之前一定要判断一下,数据是否正在被修改
乐观锁:假设不会发生冲突,只在提交操作时检查是否违反数据完整性
读乐观锁:不需要判定数据的一致性,只管自己读
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);//释放锁
}
}
}