千家信息网

Java并发编程之StampedLock锁怎么应用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"Java并发编程之StampedLock锁怎么应用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2026年11月03日Java并发编程之StampedLock锁怎么应用

本篇内容介绍了"Java并发编程之StampedLock锁怎么应用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

StampedLock:

StampedLock是并发包里面JDK8版本新增的一个锁,该锁提供了三种模式的读写控制,当调用获取锁的系列函数时,会返回一个long 型的变量,我们称之为戳记(stamp),这个戳记代表了锁的状态。其中try 系列获取锁的函数,当获取锁失败后会返回为0的stamp值。当调用释放锁和转换锁的方法时需要传入获取锁时返回的stamp值。

StampedLock提供的三种读写模式的锁分别如下:

  • 写锁witeLock: 是一个排它锁或者独占锁,某时只有一个线程可以获取该锁,当一个线程获取该锁后,其他请求读锁和写锁的线程必须等待,这类似于 ReentrantReadWriteLock的写锁(不同的是这里的写锁是不可重入锁):当目前没有线程持有读锁或者写锁时才可以获取到该锁。请求该锁成功后会返回一个stamp变量用来表示该锁的版本,当释放该锁时需要调用unlockWrite方法并传递获取锁日的 stamp 参数。并且它提供了非阻塞的tryWriteLock 方法。

  • 悲观读锁 readLock: 是一个共享锁,在没有线程获取独占写锁的情况下,多个线程可以同时获取该锁。如果已经有线程持有写锁,则其他线程请求获取该读锁会被阻塞,这类似于 ReentrantReadWriteLock 的读锁(不同的是这里的读锁是不可重入锁)。这里说的悲观是指在具体操作数据前其会悲观地认为其他线程可能要对自己操作的数据进行修改,所以需要先对数据加锁,这是在读少写多的情况下的一种考虑。请求该锁成功后会返回一个stamp变量用来表示该锁的版本,当释放该锁时需要调用 unlockRead 方法并传递 stamp 参数。并且它提供了非阻塞的 tryReadLock 方法。

  • 乐观读锁tryOptimisticRead: 它是相对于悲观锁来说的,在操作数据前并没有通过 CAS设置锁的状态,仅仅通过位运算测试。如果当前没有线程持有写锁,则简单地返回一个非0的stamp版本信息。获取该 stamp 后在具体操作数据前还需要调用 validate 方法验证该 stamp 是否已经不可用,也就是看当调用 tryOptimisticRead 返回 stamp后到当前时间期间是否有其他线程持有了写锁,如果是则validate 会返回0否则就可以使用该stamp版本的锁对数据进行操作。由于tryOptimisticRead 并没有使用CAS设置锁状态,所以不需要显式地释放该锁。该锁的一个特点是适用于读多写少的场景,因为获取读锁只是使用位操作进行检验,不涉及CAS操作,所以效率会高很多,但是同时由于没有使用真正的锁,在保证数据一致性上需要复制一份要操作的变量到方法栈,并且在操作数据时可能其他写线程已经修改了数据,而我们操作的是方法栈里面的数据,也就是一个快照,所以最多返回的不是最新的数据,但是一致性还是得到保障的。

StampedLock还支持这三种锁一定条件下进行相互转换。例如long tryConvertToWriteLock(long stamp)期望把stamp 标示的锁升级为写锁,

这个函数会在下面几种情况下返回一个有效的stamp(也就是晋升写锁成功):

  • 当前锁已经是写锁模式了。

  • 前锁处于读锁模式,并且没有其他线程是读锁模式

  • 当前处于乐观读模式,并且当前写锁可用

另外,StampedLock 的读写锁都是不可重入锁,所以在获取锁后释放锁前不应该再调用会获取锁的操作,以避免造成调用线程被阻塞。当多个线程同时尝试获取读锁和写锁时,谁先获取锁没有一定的规则,完全都是尽力而为,是随机的。并且该锁不是直接实现 Lock 或 ReadWriteLock 接口,而是其在内部自己维护了一个双向阻塞队列。

下面通姑JDK8里面提供的一个管理二维点的例子来理解以上介绍的概念。

package LockSupportTest;import com.sun.org.apache.bcel.internal.generic.BREAKPOINT;import java.util.concurrent.locks.StampedLock;public class Point_Class {    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 distanceFromOrin() {        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);                }            }}

在如上代码中,Point类里面有两个成员变量(x,y)用来表示一个点的二维坐标,和三个操作坐标变量的方法。另外实例化了一个StampedLock对象用来保证操作的原子性。

"Java并发编程之StampedLock锁怎么应用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

线程 数据 方法 变量 模式 版本 阻塞 悲观 情况 成功 也就是 函数 同时 状态 应用 编程 不同 一致 乐观 一致性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 小米移动互联网科技园 杭州互联网科技公司 中国互联网科技发展 互联网科技革命 科技创新互联网企业 湖南洣水互联网科技有限公司扣款 科技与互联网的利与弊 江苏南京365互联网科技 互联网金融科技公司干啥的 彤创互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 呼和浩特新华互联网科技学院 互联网科技和信息 众安科技工业互联网合作 互联网金融科技公司的优势 四川互联网展示科技馆设计 长沙渺峰互联网科技有限公司 科技信息时代互联网发展 承德科技产业互联网平台 互联网科技社 网络科技有限互联网 互联网科技集团 世界互联网领先科技成果 广西互联网科技公司 互联网对科技的发展 成都互联网科技公司工作好不好 长沙茂晟互联网科技有限公司 宁波跨境商互联网科技有限公司 银川新华互联网科技学校原画
0