首页 > 其他分享 >腾讯面试:什么锁比读写锁性能更高?

腾讯面试:什么锁比读写锁性能更高?

时间:2024-05-15 09:43:49浏览次数:14  
标签:乐观 并发 stamp lock 读写 StampedLock 面试 读锁 腾讯

在并发编程中,读写锁 ReentrantReadWriteLock 的性能已经算是比较高的了,因为它将悲观锁的粒度分的更细,在它里面有读锁和写锁,当所有操作为读操作时,并发线程是可以共享读锁同时运行的,这样就无需排队执行了,所以执行效率也就更高。

那么问题来了,有没有比读写锁 ReentrantReadWriteLock 性能更高的锁呢?

答案是有的,在 Java 中,比 ReentrantReadWriteLock 性能更高的锁有以下两种:

  1. 乐观锁:乐观锁是一种非阻塞锁机制,它是通过 Compare-And-Swap(CAS)对比并替换来进行数据的更改的,它假设多个线程(或进程)之间很少会发生冲突,因此不会加锁,只有在需要修改之后,通过对比并替换来修改共享变量的值,因此它在非高并发的环境下的性能是非常高的。
  2. StampedLock:它是 JDK 8 中新增的锁类型,它提供了三种锁模式:读锁、写锁和乐观读锁。相较于 ReentrantReadWriteLock,StampedLock 提供了更细粒度的控制,支持乐观读取操作,可以提高并发性能。

1.乐观锁

乐观锁在 Java 中最常见的实现就是 atomic 家族下的类,例如 AtomicInteger、AtomicLong 等,它的核心方法中使用了 CAS 对比并替换进行变量的修改操作,如下源码所示:

public final int incrementAndGet() {
    return U.getAndAddInt(this, VALUE, 1) + 1;
}
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        v = getIntVolatile(o, offset);
    } while (!weakCompareAndSetInt(o, offset, v, v + delta)); // CAS 方法
    return v;
}

然而,如果是高并发环境下,那么乐观锁可以需要通过多次自旋才能成功修改变量的数据,这种场景下,乐观锁的性能可能就不如 ReentrantReadWriteLock 了。

2.StampedLock

StampedLock 有三种读写方法:

  • readLock:读锁,用于多线程并发读取共享资源。
  • writeLock:写锁,用于独占写入共享资源。
  • tryOptimisticRead:读乐观锁,用于在不阻塞其他线程的情况下尝试读取共享资源。

其中 readLock() 和 writeLock() 方法与 ReentrantReadWriteLock 的用法类似,而 tryOptimisticRead() 方法则是 StampedLock 引入的新方法,它用于非常短的读操作。

因此,我们在加锁时,可以使用性能更高的读乐观锁来替代传统的读锁,如果能加锁成功,则它可以和其他线程(即使是写操作)一起执行,也无需排队运行(传统读锁遇到写锁时需要排队执行),这样的话 StampedLock 的执行效率就会更高,它是使用如下:

// 创建 StampedLock 实例
StampedLock lock = new StampedLock();
// 获取乐观读锁
long stamp = lock.tryOptimisticRead(); 
// 读取共享变量
if (!lock.validate(stamp)) { // 检查乐观读锁是否有效
    stamp = lock.readLock(); // 如果乐观读锁无效,则获取悲观读锁
    try {
        // 重新读取共享变量
    } finally {
        lock.unlockRead(stamp); // 释放悲观读锁
    }
}

// 获取悲观读锁
long stamp = lock.readLock(); 
try {
    // 读取共享变量
} finally {
    lock.unlockRead(stamp); // 释放悲观读锁
}

// 获取写锁
long stamp = lock.writeLock(); 
try {
    // 写入共享变量
} finally {
    lock.unlockWrite(stamp); // 释放写锁
}

使用乐观读锁的特性可以提高读操作的并发性能,适用于读多写少的场景。如果乐观读锁获取后,在读取共享变量前发生了写入操作,则 validate 方法会返回 false,此时需要转换为悲观读锁或写锁重新访问共享变量。

课后思考

StampedLock 底层是如何实现的?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:乐观,并发,stamp,lock,读写,StampedLock,面试,读锁,腾讯
From: https://www.cnblogs.com/vipstone/p/18193158

相关文章

  • 面试题-JAVA基础
    JAVA有几种基本数据类型,各种类型占用字节大小?64位JVM中,int的长度是多数?Java的Integer缓存池大小是多少?Java中应该使用什么数据类型来描述价格?什么是装箱和拆箱?Java中的值传递和引用传递有什么区别?java8和java9的String类型的区别String,StringBuilder,StringBuffer区别......
  • 整理面试内容
    一面:报错500是什么错误,安卓iOS区别测试流程、怎么抓包、ios和安卓测试区别cooked和session区别fiddler抓包,抓包机制二面:web测试和app测试的区别,安卓系统和ios的区别,之前印象深的bug,sql语句,还有就是一些稳定性方面的,家住的多远,怎么看加班苹果怎么打测试包,苹果和安卓测试的区别......
  • Java面试题 - Java基础
    参考教程【本文参考自以下文章,部分图片及代码片段也取自以下文章,如果构成侵权,请联系我进行修改/删除】【如果构成侵权,请联系我进行修改/删除】【如果构成侵权,请联系我进行修改/删除】【如果构成侵权,请联系我进行修改/删除】自学精灵-首页(本文几乎所有的内容都是自学精灵上......
  • 【反向思维】怎么判断面试者是否有扎实的前端基础?
    前鹅厂前端,待了4年,也算是个前端部分还有点复杂的项目的负责人。在鹅厂面试了几百人,慢慢总结了一下自己的经验,希望对求职的同学有帮助,反向思维及去准备。【技术大厂,前后端可投】我一般就问四个问题,主要还是引导让候选人自个发挥。1,问项目(40分)做过哪些项目,在其中怎么思考的。如果......
  • 微信云托管使用腾讯自家免费提供50张额度的SSL证书,稳得一批
    因为之前的免费证书小程序打包后就提示证书无效,只能在模拟器才能用,然后有个功能就一直没上,刚才无意间想着谷歌搜索一下看有没有能用的免费证书: 嘿,您猜怎么着,还真有,还是腾讯自家的,这不妥了吗。遂申请使用,审核一下就通过了,很快,然后我就在微信云托管换上了新证书,嘿,就不报错了,这......
  • web前端面试题(一直更新)
    一、Vue1、v-show和v-if不同(1)实现方式v-if是一种条件渲染指令,它会根据表达式的值来插入或删除元素。当表达式的值为真时,元素会被插入到DOM中,否则会从DOM中删除。v-show是一种简单的显示/隐藏指令,它会根据表达式的值来显示或隐藏元素。当表达式的值为真时,元素会被显示,否则会......
  • 计算机网络常见面试题总结(上)
    计算机网络常见面试题总结(上)OSI七层模型应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。每一层都为上一层提供服务TCP/IP四层模型应用层,传输层,网络层,网络接口层,各层相互独立,为上层提供服务常见的网络协议应用层:HTTP,超文本传输协议,浏览器网页使用的就是HTTP请求加载的。SM......
  • 一道需要仔细看的java面试题
    publicstaticvoidmain(String[]args){ Map<String,Object>resultMap=newHashMap<String,Object>(); Stringstr=MapUtil.getStr(resultMap,"yyyy"); System.out.println("++"+str); System.out.println(&......
  • uniapp小程序上传图片到腾讯云
    记录下首次首次使用uniapp小程序上传图片到腾讯云1、去腾讯云查看资料,因为图片是上传到腾讯云的,无非就是网络请求与验证的关系,参考资料https://cloud.tencent.com/2、在腾讯云控制塔输入 '对象存储'   3、找到API文档和SDK文档 4、选择您需要的SDK,我需要是小程序SDK......
  • SQL经典面试题
    一、连续问题▶如下数据为蚂蚁森林中用户领取的减少碳排放量问题:找出连续3天及以上,减少碳排放量在100以上的用户。思路:① t1②t2③ t3④最终版 二、分组问题▶如下电商公司用户访问时间数据  (ts单位:秒)问题:某个用户连续的访问记录,如果时间间隔<60秒......