readLock():返回一个读锁对象,用于获取读锁。
writeLock():返回一个写锁对象,用于获取写锁。
tryOptimisticRead():尝试获取乐观读锁,返回一个非负的 stamp 值。
validate():校验乐观读锁的 stamp 值是否仍然有效。
tryConvertToWriteLock():尝试将乐观读锁转换为写锁,成功则返回一个非负的 stamp 值,失败则返回零。
unlockRead():释放读锁。
unlockWrite():释放写锁。
一、计算坐标到原点的距离
package com.example.redkapoktools.seckill;
import java.util.concurrent.locks.StampedLock;
/**
* @ClassName: com.example.redkapoktools.seckill.Point
* @Description: 测试乐观锁
* @Author: redkapok
* @Date: 2024/4/15 20:10
* @Version: v1.0
*/
public class Point {
/**
* 坐标
*/
private double x, y;
private final StampedLock lock = new StampedLock();
/**
* 重置坐标值
* @param x
* @param y
*/
public void set(double x, double y) {
long stamp = lock.writeLock();
try {
this.x = x;
this.y = y;
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlockWrite(stamp);
}
}
/**
* 计算坐标到原点的距离
* @return
*/
public double distanceFromOrigin(){
long stamp=lock.tryOptimisticRead();
double currentX=x;
double currentY=y;
if(!lock.validate(stamp)){
try{
currentX=x;
currentY=y;
}finally{
lock.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
}
二、单元测试
package com.example.redkapoktools.seckill;
/**
* @ClassName: com.example.redkapoktools.seckill.TestStampedLock
* @Description:单元测试
* @Author: redkapok
* @Date: 2024/4/15 20:17
* @Version: v1.0
*/
public class TestStampedLock {
public static void main(String[] args) {
Point point=new Point();
point.set(3.0,4.0);
Runnable readTask=()->{
double distance=point.distanceFromOrigin();
System.out.println("Distance from origin:"+distance);
};
Runnable writeTask = () -> {
point.set(5.0,12.0);
System.out.println("Point coordinates updated.");
};
Thread t3 = new Thread(readTask);
Thread t2 = new Thread(writeTask);
Thread t1 = new Thread(readTask);
t1.start();
t2.start();
t3.start();
}
}