乐观锁StampedLock

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();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容