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

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

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

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

    面试被ReentrantLock的公平与非公平

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

    61110

    刨根底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.8K30

    linux读写

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

    3.3K30

    面试被各种怎么办?

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

    69920

    为什么业务面试总“乐观

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

    26010

    linux读写_共享内存读写

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

    6.2K10

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

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

    69920

    数据库 12 连,抗住!

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

    62220

    Linux文件—文件

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

    9.5K20

    Linux线程互斥

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

    8810

    Redis分布式实现Redisson 15

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

    52220

    大厂面试官必的Mysql机制

    前言 前几天有粉丝和我聊到他找工作面试大厂时被的问题,因为现在疫情期间,找工作也特别难找。他说面试的题目也比较难,都偏向于一两年的工作经验的面试题。...种类 Mysql中的分类按照不同类型的划分可以分成不同的,按照「的粒度」划分可以分成:「表、页、行」;按照「使用的方式」划分可以分为:「共享」和「排它」;按照思想的划分:「乐观」和「...「页」的粒度是介于行和表之间的一种,因为页是在BDB中支持的一种机制,也很少没人提及和使用,所以这里制作概述,不做详解。...「行」是粒度最小的机制,行的加锁开销性能大,加锁慢,并且会出现死锁,但是行冲突的几率低,并发性能高。...InnoDB行和表 InnoDB的行也是分为行级「共享读(S)「和」排它写(X)」,原理特点和MyISAM的表级两种模式是一样的。

    90310
    领券