首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试常问 乐观锁 & 悲观锁 、自旋锁 & 互斥锁 ?诸君听我一言

乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解后端多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。...传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。悲观锁的实现往往依靠数据库本身的锁功能实现。 实现 可以使用数据库的锁机制。...乐观锁 VS 悲观锁 只能说,各有千秋吧。 乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。...上面那个例子放在这里就变成了:一方拿到锁之后,另一方就等着,知道一方将锁释放,另一方继续操作。 自旋锁 & 互斥锁 自旋锁和互斥锁嘛,一直在用的,不过以前只是简单的叫它们:锁。原来人家有名字的啊。...哈哈哈哈哈 自旋锁的原理比较简单,如果持有锁的线程能在短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞状态,它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取

89130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试被问ReentrantLock的公平锁与非公平锁

    面试被问ReentrantLock的公平锁与非公平锁的区别以及实现。 建议先阅读Java中的锁原理、锁优化、CAS、AQS,看这篇就对了!...这两个类也就是我们所说的公平锁与非公平锁。 还可以通过手动设置公平锁与非公平锁 public ReentrantLock(boolean fair) { sync = fair ?...总结 公平锁和非公平锁只有两处不同: 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。...非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态...公平锁和非公平锁就这两点区别,如果这两次 CAS 都不成功,那么后面非公平锁和公平锁是一样的,都要进入到阻塞队列等待唤醒。 相对来说,非公平锁会有更好的性能,因为它的吞吐量比较大。

    62010

    刨根问底synchronized | 锁系列-Java中的锁

    我们来看看常见的linux的内核互斥锁长什么样: /linux/include/linux/mutex.h struct mutex { /* 1: unlocked, 0: locked...用户态和内核态 至于用户态和内核态的这里简单介绍下: Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。...所以,为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。...Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态和用户态。...自旋锁不会引起调用者睡眠,如果自旋锁已经被别的单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,“自旋”一词就是因此而得名。 也就是说自旋锁就是一直在那里刷新,看看锁有没有被释放。

    3.5K71

    Linux文件锁

    一、文件锁的分类: 翻阅参考资料,你会发现文件锁可以进行很多的分类,最常见的主要有读锁与写锁,前者也叫共享锁,后者也叫排斥锁,值得注意的是,多个读锁之间是不会相互干扰的,多个进程可以在同一时刻对同一个文件加读锁...;但是,如果已经有一个进程对该文件加了写锁,那么其他进程则不能对该文件加读锁或者写锁,直到这个进程将写锁释放,因此可以总结为:对于同一个文件而言,它可以同时拥有多个读者,但是在某一时刻,他只能拥有一个写者...根据内核行为来分,文件锁可以分成劝告锁与强制锁两大类: 1....二、文件锁相关的系统调用: 目前跟文件加锁相关的系统调用主要有两个: flock与fcntl, 二者在应用范围方面也存在着一些差别,早起的flock函数只能处理劝告锁,在Linux...2.6版本中将其功能扩充至强制锁,另外 flock函数只能对整个文件加锁,不能加记录锁,而fcntl函数则不仅完全支持加劝告锁与强制锁,还支持记录锁,另外因为它符合POSIX标准,具有很好的可移植性。

    2.3K40

    linux 文件锁

    文件锁基本概念 Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。...文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。...文件锁包括建议性锁和强制性锁: 建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁,它们依靠程序员遵守这个规定。...在Linux中,实现文件上锁的函数有lockf()和fcntl() lockf()用于对文件施加建议性锁 fcntl()不仅可以施加建议性锁,还可以施加强制锁。...fcntl()还能对文件的某一记录上锁,也就是记录锁。 记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。

    2.9K30

    面试被问各种锁怎么办?

    嗯,通常我不需要显示的使用这把锁,当我们对数据库表进行CRUD操作时MYSQL会自动给这个表加上元数据锁,并且这把锁会和所有企图改变表结构的SQL互斥。...好,你再说一下MySQL的表锁吧 表锁就是表级别的锁,而且InnoDB存储引擎层支持表锁。 而且上面说过的MDL锁,个人感觉也可以将元数据锁理解成是表锁中的一种。...想了解这个知识点可以看这篇:全网最牛X的两阶段串讲 你了解间隙锁吗?什么是间隙锁? 间隙锁也是行锁中的一种:但是它会锁定的是一个间隙范围,而不会锁住某条记录。...但是:意向锁也并不是完全形同虚设的,因为它和除意向锁之外其他类型的锁之间是满足读读共享、读写互斥的原则的。 嗯,到现在我们也说了很多锁了,你可否总结一下各种常见锁之间的关系呢? 嗯,好啊!...(可左右滑动) 锁类型 普通独占锁 普通共享锁 意向独占锁 意向共享锁 普通独占锁 互斥 互斥 互斥 互斥 普通共享锁 互斥 不互斥 互斥 不互斥 意向独占锁 互斥 互斥 不互斥 互斥 意向共享锁 互斥

    70420

    linux读写锁

    读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3....不加锁状态 读写锁特性: 1. 读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞。 2....那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行阻塞,写锁优先级高 读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。...读写锁非常适合于对数据结构读的次数远大于写的情况。...函数 以读方式请求读写锁。

    3.3K30

    为什么业务面试总问“乐观锁”

    “乐观锁”是咱们程序员在面试的过程中经常会碰到的,那么这里我们来聊一下它的重要性。 乐观锁与高并发 如果面试官和你聊“乐观锁”,那么大概率是要延展到“高并发”。...是不是使用“乐观锁”之后,我们的业务接口就可以高枕无忧了呢?答案是否定的,乐观锁只是降低了“悲观锁”的锁冲突的概率,或者简单的说是为了延缓锁冲突。 使用乐观锁会带来哪些技术风险呢?...如果是框架实现的乐观锁,框架都会有统一的乐观锁异常机制,乐观锁冲突次数达到阈值之后,会触发异常机制,并将异常显示的抛给业务服务。...面试官聊“乐观锁”,就是要考察咱们程序员的“高并发”的处理能力。 乐观锁与性能 上面说到了“乐观锁”在一定的并发量之后,会严重的影响业务接口的可用性,甚至会拖慢整个微服务体系。...乐观锁与数据 为什么说“乐观锁”与数据关系很大了,因为咱们使用“乐观锁”就是为了保护我们数据的一致性,所以如果聊乐观锁,肯定会考察与数据相关的知识点,比如MySQL的锁,ElasticSearch的乐观锁等等

    26210

    【Linux】多线程(自旋锁、读写锁)

    今日更新了Linux线程的内容 欢迎大家关注点赞收藏⭐️留言 自旋锁 概述 自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。...在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。...原理 自旋锁通常使用一个共享的标志位(如一个布尔值)来表示锁的状态。当标志位为 true 时,表示锁已被某个线程占用;当标志位为 false 时,表示锁可用。...可能引起活锁:当多个线程同时等待一个锁时,如果没有适当的退避策略,可能会导致所有线程都在不断检查锁状态而无法进入临界区,形成活锁。...Linux提供的自旋锁系统调用 int pthread_spin_lock(pthread_spinlock_t *lock); int pthread_spin_trylock(pthread_spinlock_t

    13610

    linux读写锁_共享内存读写锁

    一、读写锁是什么?...读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 ps:读写锁本质上是一种自旋锁 二、为什么需要读写锁?...读写之间是互斥的—–>读的时候写阻塞,写的时候读阻塞,而且读和写在竞争锁的时候,写会优先得到锁 四、自旋锁&挂起等待是锁?...1.自旋锁 自旋锁是在发生获取不到锁的时候,会直接等待,不会被CPU直接调度走,而是会一直等到获取到锁,因为此锁是一直的在等待,所以不会有调度的开销,故此锁的效率比挂起等待锁的效率高,但是此锁会因不停的查看锁的释放情况...,故会浪费更多的CPU资源 2.挂起等待锁 挂起等待锁是当某线程在执行临界区的代码时,那其他线程只能挂起等待,此时这些线程会被CPU调度走,等到锁释放(即就是临界区的代码被之前的那个线程已经执行完毕

    6.2K11

    【Linux】:多线程(读写锁 && 自旋锁)

    // 在写操作期间,不允许其他线程获取读锁或写锁 pthread_rwlock_wrlock 用于获取写锁。写锁是独占的,即任何一个线程持有写锁时,其他线程不能获得读锁或写锁。...1.5 性能开销:读写锁 VS 互斥锁 读写锁的性能开销与普通互斥锁相比,通常情况下读写锁的单次加锁开销大于互斥锁。...Linux 提供的自旋锁系统调用 #include int pthread_spin_lock(pthread_spinlock_t *lock); int pthread_spin_trylock...2.5 自旋锁 VS 互斥锁 与传统的互斥锁(Mutex)不同,互斥锁通常会让线程在无法获得锁时进入休眠状态,减少 CPU 的浪费,而自旋锁则在锁被占用时不断轮询,直到获取到锁。....°★* 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Linux】的内容,请持续关注我 !!

    17810

    面试官问:select......for update会锁表还是锁行?

    details/109544539 验证 结合一下实例验证 结果 ---- select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁。...那么它加的是行锁还是表锁,这就要看是不是用了索引/主键。 没用索引/主键的话就是表锁,否则就是是行锁。...图一为第一个事务,并且没有提交事务 图二为第二个事务,去更新数据,被阻塞了 图三为第二个事务,长时间拿不到锁报错。...实例4: 使用普通的字段code去操作 另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。...如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。 ---- ---- 欢迎加入我的知识星球,一起探讨架构,交流源码。

    73320

    数据库锁 12 连问,抗住!

    金三银四很快就要来啦,准备了数据库锁的12连问,相信大家看完肯定会有帮助的。 1. 为什么需要加锁 在日常生活中,如果你心情不好想静静,不想被比别人打扰,你就可以把自己关进房间里,并且反锁。...InnoDB有哪些锁? 2.1 共享/排他锁 InnoDB 实现了两种标准的行级锁:共享锁(简称 S 锁)、排他锁(简称 X 锁)。...共享锁:简称为 S 锁,在事务要读取一条记录时,需要先获取该记录的 S 锁。 排他锁:简称 X 锁,在事务需要改动一条记录时,需要先获取该记录的 X 锁。...S 锁和 X 锁的兼容关系如下图表格: X锁和S锁是对于行记录来说的话,因此可以称它们为行级锁或者行锁。我们认为行锁的粒度就比较细,其实一个事务也可以在表级别下加锁,对应的,我们称之为表锁。...别的事务不可以获得该表的X锁,也不可以继续获得该表某些记录的X锁。 2.2 意向锁 什么是意向锁呢?意向锁是一种不与行级锁冲突的表级锁。

    62420

    Redis分布式锁实现Redisson 15问

    六、如何主动释放锁和避免其它线程释放了自己加的锁 当业务执行完成之后,肯定需要主动释放锁,那么为什么需要主动释放锁呢?...Redisson通过RedissonReadWriteLock类来实现读写锁的功能,通过这个类可以获取到读锁或者写锁,所以真正的加锁的逻辑是由读锁和写锁实现的。...如果没有加锁,那么不论是读锁还是写锁都能加成功,成功之后根据锁的类型维护mode字段。 如果模式是读锁,那么加锁线程是来加读锁的,就让它加锁成功。...如果模式是读锁,那么加锁线程是来加写锁的,就让它加锁失败。 如果模式是写锁,那么加锁线程是来加写锁的,就让它加锁失败(加锁线程自己除外)。...客户端使用当前时间减去开始获取锁时间(步骤1记录的时间)就得到获取锁使用的时间。当且仅当从大多数(这里是3个节点)的Redis节点都取到锁,并且使用的时间小于锁失效时间时,锁才算获取成功。

    55220

    Linux文件—文件锁

    在Linux系统中,通常采用“文件锁”的方式,当某个进程独占资源的时候,该资源被锁定,其他进程无法访问,这样就解决了共享资源的竞争问题。 文件锁包括建议性锁(又名“协同锁”)和强制性锁两种。...建议性锁要求每个相关进程访问文件的时候检查是否已经有锁存在并尊重当前的锁。一般情况下不建议使用建议性锁,因为无法保证每个进程都能自动检测是否有锁,Linux内核与系统总体上都坚持不使用建议性锁。...在Linux内核提供的系统调用中,实现文件上锁的函数有lockf()和fcntl(),其中lockf()用于对文件加建议性锁,这里不再讲解。fcntl()函数既可以加建议性锁,也可以加强制性锁。...同时,fcntl()还能对文件某部分上记录锁。所谓记录锁,其实就是字节范围锁,它能锁定文件内某个特定区域,当然也可锁定整个文件。 记录锁又分为读锁和写锁两种。...其中读锁又称为共享锁,它用来防止进程读取的文件记录被更改。记录内可设置多个读锁,但当有一个读锁存在的时候就不能在该记录区域设置写锁。

    9.5K20

    Linux线程互斥锁

    今天我们学习Linux线程互斥的话题。Linux同步和互斥是Linux线程学习的延伸。但这部分挺有难度的,请大家做好准备。那我们就正式开始了。...相信大家第一次听到锁。对于什么是锁,如何加锁,锁的原理是什么我们都不清楚,别着急,我们在接下来的内容里会进行详细的详解。 我们先使用一下锁,见见猪跑!!...锁只规定互斥访问,没有规定谁优先访问。 锁就是让多个线程公平竞争的结果,强者胜出嘛。 关于互斥锁的理解 所有的执行流都可以访问这一把锁,所以锁是一个共享资源。...关于原子性的理解 如图,三个执行流 问:如果线程1申请锁成功,进入临界资源,正在访问临界资源区的时候,其他线程在做什么? 答:都在阻塞等待,直到持有锁的线程释放锁。...问; 如果线程1申请锁成功,进入临界资源,正在访问临界资源区的时候,可不可以被切换? 答:绝对是可以的,CPU管你有没有锁呢,时间片到了你必须下来。

    9410
    领券