首页 > 其他分享 >StampedLock 使用例子

StampedLock 使用例子

时间:2024-02-26 15:36:56浏览次数:20  
标签:stamp double 使用 long StampedLock 读锁 例子 sl

StampedLock 是 Java 8 引入的一种新的锁机制,它是 ReadWriteLock 的改进版,提供了更高的并发性和更好的性能。下面是一个使用 StampedLock 的示例:

import java.util.concurrent.locks.StampedLock;

public class StampedLockDemo {
    private double x, y;
    private final StampedLock sl = new StampedLock();

    // 排它锁-写锁
    void move(double deltaX, double deltaY) {
        long stamp = sl.writeLock();
        try {
            x += deltaX;
            y += deltaY;
        } finally {
            sl.unlockWrite(stamp);
        }
    }

    // 乐观读锁
    double distanceFromOrigin() {
        long stamp = sl.tryOptimisticRead();
        double currentX = x, currentY = y;
        if (!sl.validate(stamp)) {
            stamp = sl.readLock();
            try {
                currentX = x;
                currentY = y;
            } finally {
                sl.unlockRead(stamp);
            }
        }
        return Math.sqrt(currentX * currentX + currentY * currentY);
    }

    // 悲观读锁
    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 != 0L) {
                    stamp = ws;
                    x = newX;
                    y = newY;
                    break;
                } else {
                    // 升级为写锁失败,释放悲观读锁,再获取写锁
                    sl.unlockRead(stamp);
                    stamp = sl.writeLock();
                }
            }
        } finally {
            sl.unlock(stamp);
        }
    }
}

在上面的示例中,我们使用 StampedLock 来实现一个二维平面上的点,具有移动、计算距离以及在原点处移动等操作。其中,move() 方法使用排它锁(写锁)来保证线程安全;distanceFromOrigin() 方法使用乐观读锁来提高并发性能;moveIfAtOrigin() 方法则使用悲观读锁来保证线程安全并避免死锁。

标签:stamp,double,使用,long,StampedLock,读锁,例子,sl
From: https://www.cnblogs.com/sunupo/p/18034417

相关文章

  • linux使用except和子进程交互
    #!/bin/bash#set-x#FTP服务器信息FTP_HOST="ftp.deepvision-tech.com"FTP_USERNAME="huangbinbin"FTP_PASSWORD="xxxxx."#远程目录和文件REMOTE_DIRECTORY=$1LOCAL_FILE=$2ftp_command="ftp-n$FTP_HOST"check_directory="......
  • Jenkins流水线使用@Grab 导入Maven库
    有个需求需要在pipeline中调用Java的SDK去执行业务使用@Grab注解可以在Maven中导入Java库,@Grab('org.apache.commons:commons-math3:3.4.1')importorg.apache.commons.math3.primes.Primes引入依赖后,在通过import导入另外的写法@Grab(group='org.springframework',mod......
  • EvoSuite使用总结
    1.安装EvoSuite插件以IDEA为例,在Plugins栏搜索EvoSuite后点击install,安装完成后重启IDEA2.使用EvoSuite选中文件右键选择RunEvoSuite生成成功可以看到如下提示:注意事项:生成路径:src/test/java使用junit4版本然后在pom.xml文件添加如下依赖:<dependency>......
  • Qt的拖拽操作例子
    本文是一个拖拽文本的例子。演示了如何把按钮的标题拖拽到文本编辑框里。Qt对拖拽的封装很好,QDrag对象简单易用。本文程序测试环境是VS2017和Qt5.9。下面是程序拖拽时的效果图,可以看出来拖拽的时候光标下方也显示了文本内容:头文件。本功能是在主窗口中实现的。下面代码里QtTest......
  • maven使用systemPath方式加载本地jar(代码库)
    比如,jar包直接放到根目录 pom.xml里这么配置<dependency><groupId>njcanc</groupId><artifactId>njcanc</artifactId><version>2.12</version><scope>system</scope><systemPath>${project.b......
  • 什么是数据同步利器DataX,如何使用?
    转载至我的博客https://www.infrastack.cn,公众号:架构成长指南今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎,官网地址:https://github.com/alibaba/DataX什么是Datax?DataX是阿里云DataWorks数据集成的开源版本,使用Java语言编写,在阿......
  • Java 使用 itext 向PDF插入数据和图片
    Java使用itext向PDF插入数据和图片一、下载AdobeAcrobatDC二、制作模板1、准备一个word模板,并转换成PDF格式2、使用AdobeAcrobatDC打开PDF文档,并在右侧搜索框搜索表单,点击准备表单 3、点击开始,制作PDF表单 4、扫描完成后如下图,蓝白色框就是可编辑表单......
  • 从零开始写 Docker(二)---优化:使用匿名管道传递参数
    本文为从零开始写Docker系列第二篇,主要在mydockerrun命令基础上优化参数传递方式,改为使用runC同款的匿名管道传递参数。如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。扫描下方二维码或搜索公众号【探索云原生】即可订阅完整代......
  • WPF|--XAML|--使用其它名称空间中类型
    关键字词XAML--使用其它名称空间中类型语法格式<!--{}括起来的表示占位符-->xmlns:{Prefix}="clr-namespace:{Namespace};assembly={AssemblyName}"示例<!--演示如何访问System名称空间中的基本类型,并将其映射为前缀"sys_mine:"--><UserControlx:Class="WpfAp......
  • PowerShell 中,你可以使用一些命令来处理映像文件,包括挂载、捕捉、卸载、格式转换和编
    PowerShell中,你可以使用一些命令来处理映像文件,包括挂载、捕捉、卸载、格式转换和编辑映像。以下是一些常用的命令:挂载映像(MountImage):powershellCopyCodeMount-WindowsImage-ImagePath"C:\Path\To\Image.wim"-Path"C:\Mount\Directory"-Index1捕捉映像(CaptureIm......