Discuss / Java / 在评论区看到老师一句重点。乐观锁其实不上锁,只检查版本号,它的目的是把read-write-lock的read加读锁这一步给去了

在评论区看到老师一句重点。乐观锁其实不上锁,只检查版本号,它的目的是把read-write-lock的read加读锁这一步给去了

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]
评论区看到老师两句重点:
一:乐观锁其实不上锁,只检查版本号,它的目的是把read-write-lock的read加读锁这一步给去了,因为绝大多数情况下没有写,不需要加读锁。

二:乐观锁其实只是保证从 tryOptimisticRead 到 validate 之间的代码执行的逻辑完整性,也就是我这一次get取到的数据是一个线程中的数据。没有被其他线程污染的。

        long stamp = stampedLock.tryOptimisticRead(); // 获得一个乐观读锁
        // 注意下面两行代码不是原子操作
        // 假设x,y = (100,200)
        double currentX = x;
        // 此处已读取到x=100,但x,y可能被写线程修改为(300,400)
        double currentY = y;
        // 此处已读取到y,如果没有写入,读取是正确的(100,200)
        // 如果有写入,读取是错误的(100,400)
        if (!stampedLock.validate(stamp)) { // 检查乐观读锁后是否有其他写锁发生

三:乐观锁比上一节悲观锁为什么会提高并发效率,上一节,假设一个线程正在读,读的时候是不允许写入的,而乐观锁其实没有加锁,随时可以写入。乐观锁只会检测我获取到这一次数据的数据是一个线程中的。但是潜意识告诉我这块没这么简单,,以后再研究。&&^^


  • 1

Reply