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

· 浏览次数 : 0

小编点评

**比 ReentrantReadWriteLock 性能更高的锁有:** 1. **乐观锁:**它是通过 CAS 对比并替换来进行数据的更改的,它假设多个线程之间很少会发生冲突,因此不会加锁,只有在需要修改之后,通过对比并替换来修改共享变量的值。 2. **StampedLock:**它是 JDK 8 中新增的锁类型,它提供了三种锁模式:读锁、写锁和乐观读锁。相较于 ReentrantReadWriteLock,StampedLock 提供了更细粒度的控制,支持乐观读取操作,可以提高并发性能。 **其他性能提升方法:** 1. 使用性能更高的读乐观锁来替代传统的读锁,如果能加锁成功,则它可以和其他线程(即使是写操作)一起执行,也无需排队运行。 2. 使用 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、设计模式、消息队列等模块。

与腾讯面试:什么锁比读写锁性能更高?相似的内容:

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

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

[转帖]关于面试时HA(RAC)会问到的一些问题

1.什么是RAC(Real Application Cluster)? RAC(Real Application Cluster)是Oracle数据库的一种部署架构,它将多个数据库服务器连接在一起,共同组成一个实例。这些服务器之间通过高速网络相互通信,共享存储和计算资源,从而提供更高的可用性、性能和

从数据链路到神秘的MAC地址和ARP协议

在当今互联世界中,数据的传输和通信是不可或缺的。然而,你是否曾想过,在网络通信中隐藏着哪些神秘的秘密?本文将带你深入探索数据链路层、MAC地址和ARP协议的奥秘。数据链路层是网络通信中的关键一环,负责将数据包封装为帧并进行传输。而MAC地址作为设备的唯一标识符,扮演着识别节点的重要角色。而ARP协议则解决了从IP地址到MAC地址的映射问题,确保数据的准确传输。通过揭开这些网络通信的神秘面纱,你将更

腾讯面试:如何提升Kafka吞吐量?

Kafka 是一个分布式流处理平台和消息系统,用于构建实时数据管道和流应用。它最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。 Kafka 特点是高吞吐量、分布式架构、支持持久化、集群水平扩展和消费组消息消费,具体来说: 高吞吐量:Kafka 具有高性能和低延迟的特性,

抢先看!美团、京东、360等大厂面试题解析,技术面试必备。

技术面试必备!美团、京东、360等大厂面试题详解,让你轻松应对各大公司面试挑战! 往期硬核面经 哦耶!冲进腾讯了! 牛逼!上岸腾讯互娱和腾讯TEG! 腾讯的面试,强度拉满! 前几篇文章分享了上岸腾讯的最新面经。 不少粉丝股东留言说别只发腾讯的啦,其他大厂的也安排一些吧,比如美团、360、京东的。 必

2.1万字,30张图详解操作系统常见面试题(收藏版)

耗时两周,新版的操作系统常见知识点/问题总结总算搞完了,手绘了30多张图。大家可以用来复习操作系统或者准备操作系统面试。对于大部分公司的面试来说基本够用了,不过,像腾讯、字节这种大厂的面试还是要适当深入一些。 这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如 用户态和内核态、系统调用、进程和

美团面试:如何实现线程任务编排?

线程任务编排指的是对多个线程任务按照一定的逻辑顺序或条件进行组织和安排,以实现协同工作、顺序执行或并行执行的一种机制。 1.线程任务编排 VS 线程通讯 有同学可能会想:那线程的任务编排是不是问的就是线程间通讯啊? 线程间通讯我知道了,它的实现方式总共有以下几种方式: Object 类下的 wait

探索Java通信面试的奥秘:揭秘IO模型、选择器和网络协议,了解面试中的必备知识点!

通过深入探索Java通信面试的奥秘,我们将揭秘Java中的三种I/O模型(BIO、NIO和AIO)、选择器(select、poll和epoll)以及网络协议(如HTTP和HTTPS),帮助您了解在面试中必备的知识点。这些知识点对于网络编程和系统安全方面的求职者来说至关重要,掌握它们将为您的职业发展打下坚实的基础!

MQ消息队列篇:三大MQ产品的必备面试种子题

MQ(Message Queue)作为一种用于实现异步通信的技术,具有重要的作用和应用场景。在面试过程中,MQ相关的问题经常被问到,因此了解MQ的用途和设计原则是必不可少的。本文总结了MQ的常见面试题,包括MQ的作用、产品选型、消息不丢失的保证、消息消费的幂等性、消息顺序的保证、消息的高效读写、分布式事务的最终一致性等方面。通过深入理解这些问题,可以更好地理解MQ的应用和设计,为面试和实际应用提供参考。

腾讯、阿里、B站最新面经汇总,有的妥妥的凉经。

除了BAT(没错我说的B是B站的B),还有网易、希音科技、美柚等中小厂的最新面经。 这次投稿的同学行文幽默风趣,处处透漏着不成功便搞笑的骚气。 祝他早日上岸,也欢迎大家在评论区讨论这些面试题,有哪些面试题不知道怎么回答好,可以在评论区讨论留言,我会及时回复的。