什么是自旋锁和互斥锁?

由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么?

自旋锁说白了也是一种互斥锁,只不过没有抢到锁的线程会一直自旋等待锁的释放,处于busy-waiting的状态,此时等待锁的线程不会进入休眠状态,而是一直忙等待浪费CPU周期。因此自旋锁适用于锁占用时间短的场合。

这里谈到了自旋锁,那么我们也顺便说下互斥锁。这里的互斥锁说的是传统意义的互斥锁,就是多个线程并发竞争锁的时候,没有抢到锁的线程会进入休眠状态即sleep-waiting,当锁被释放的时候,处于休眠状态的一个线程会再次获取到锁。缺点就是这一些列过程需要线程切换,需要执行很多CPU指令,同样需要时间。如果CPU执行线程切换的时间比锁占用的时间还长,那么可能还不如使用自旋锁。因此互斥锁适用于锁占用时间长的场合。

什么是 CAP

CAP 定理最初是由加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想,也因此被叫做布鲁尔定理。后来在 2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)发表了 CAP 定理的证明,让它成为分布式系统领域公认的一个定理。

CAP 定理指出了,在一个跨区域网络连接,共享数据的分布式系统中,一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance) 这三个约束属性最终只能同时满足二个。

下面是关于这三个属性的简单描述:

  • 一致性:客户端进行读操作得到的数据永远是最近一次写入的数据,要求了对数据读写的强一致性。
  • 可用性:客户端的请求在限定时间内总能从非故障的系统节点得到正常的响应,其中不能有超时,不能出错如 502之类。
  • 分区容错性:就是出现网络分区现象,即节点间无法正常通信,数据同步出现延时等情况时,系统仍能继续提供服务。

需要注意的是,CAP 描述了一个常规的分布式系统场景:有网络连接,且数据跨节点进行共享。如果在整个系统中,数据只有一份,并且其他节点没有对应的副本,也不需要进行跨节点的数据共享,这样分布式系统就不是 CAP 关心的对象了,也谈不上结合 CAP 定理去设计和实施。

深入认识 CAP

了解 CAP 基本概念之后,我们再来分别对 C,A,P 三个属性进一步学习下,加深对 CAP 的理解。

C:一致性

这里的一致性从不同角度有着各自的描述方式,在分布式系统中表现是每个节点的数据是相同;而对于客户端,表现是读操作所得到的结果永远是最新写入的。其中需要明确的是,对于分布式系统节点来说,是可能出现某个时刻拥有不同的数据的情况:如果在某个节点执行原子性操作时,对于执行过程中的节点数据跟其他节点就并不完全一致,只有原子性操作执行完成后,节点的数据才会继续保持同步。比如常见的事务操作,只有事务提交后,客户端才能读取到事务写入的数据,失败则回滚为旧的数据,不会出现读取事务中间写入数据的情况。

一致性要求了在分布式环境下的操作要就像在单机上完成的一样,当客户端发起写请求时,收到写请求的节点会及时响应,并将更新的数据同步到另一个节点,保证数据一致性。具体的工作流程,如下所示:

  1. 客户端向节点 1 发送写操作,将数据 X 更新为 1 ,
  2. 更新操作成功,系统将更新的数据从节点 1 同步到节点 2,将节点 2 的旧数据 X 也更新为 1。
  3. 客户端再向节点 2 发送读操作获取数据 X 时,就会得到 X 最新的值:1。

一致性强调了数据的强一致,这一点要求对于一些系统可以说是十分重要的。比如电商系统的库存扣减,金融系统的转账扣款等场景,任何出现一致性的问题,都可能会造成很严重的后果。

A:可用性

介绍完一致性,再来看下可用性,虽然可用性概念相对简单,但重要程度跟一致性一样。要让系统满足可用性,就是要保证无论除了所有节点出现故障的情况外,系统都能返回有效的响应,允许响应给客户端是旧的数据,但不能出现响应失败,超时的情况。

可用性强调的是服务可用,但不保证数据的正确性。用一个简单的例子来描述分布式系统的可用性如下:允许客户端向节点 1 或者节点 2 发起读操作,当其中某一个节点故障了,不管节点间数据是否一致,只要有节点服务能收到请求,就响应 X 的值,这样就说明这两个节点服务是满足可用性。

在可用性的描述,还值得一提的是关于什么算有效的响应。要返回有效的响应,不能超时,也不能出错,结果不一定是正确的,比如返回了旧数据,但是客户端接收到后是能进行正常业务处理的。

P:分区容错性

讲完 C 和 A 之后,最后再讲一下 P: 分区容错性。由于分布式系统多个节点往往部署在多个网络环境下进行相互通信,就难免出现一些网络故障,如网络丢包,网络消息延迟,网络中断等情况,会导致节点间的通信出现问题,数据同步操作无法完成,分区容错性就要求了系统即使在网络分区出现的情况下,能仍继续对客户端提供服务。

因为分布式系统与单机不同,它涉及到了多节点间的通信和数据交互,避免不了网络问题,如果没有分区容错性,就意味着系统不允许出现节点间的通信出现任何错误,错误就意味着系统不可用,这在绝大数系统中无法接受的。因此对节点间的分区故障容错是必须要考虑的,也是 CAP 定理中分区容错性通常首先要保证的原因。

如何应用 CAP 定理

了解完 CAP 定理的一致性(C),可用性(A)和分区容错性(P)之后,我们再来看下如何使用这个定理。CAP 定理指明了 C,A,P三个属性无法同时满足,而在必有网络交互和数据同步的情况下,就一定会有延迟和数据丢失的情况,对于这种情况我们又必须接受且保证系统不能挂掉。所以分区容错性是必须要保证的,剩下的就是在一致性 (C)和可用性(A)之间做选择了。选择了一致性,保证数据正确性,但也意味系统可能存在不可用的情况;而选择可用性,保证服务的高可用,但也意味数据可能出现不一致性的情况。接下来就探讨下应用采用 CP 架构,AP 架构所各自的特点,以及如何根据不同的分布式场景选择适合的架构策略。

CP

对于 CP 架构的分布式系统来说,为了保证一致性,当出现网络分区后,如果节点 1 上数据 X 已经更新为 2,但由于节点 间数据同步的通道已经中断,节点 1 数据无法同步到节点 2,节点 2 上的数据 X 还是 1。此时如果客户端访问节点 2 的数据 X,节点 2 就需要返回错误,提示系统发生了错误,直到节点间的数据保持同步。当然这样的处理方式明显违背了可用性的要求,因此在 CAP 定理只能满足 CP。

如果一个分布式场景需要很强的一致性,或者能容忍系统长时间无响应但是数据要保持一致的情况,就比较适合使用 CP 架构设计对应的分布式系统。这样的系统一旦发生网络分区会导致数据无法同步情况,就要牺牲系统的可用性,直到节点数据达到一致后再响应。在开源社区中采用 CP 架构的应用不少,比如 Redis,HBase,MongoDB,ZooKeeper,Etcd,Consul 等都是放弃了一定可用性而选择 CP 属性。

AP

如果采用 AP 架构设计的分布式系统,为了保证可用性,当网络分区发生后,同样节点 1 上数据 X 已经更新为 2,但由于节点间数据同步的通道已经中断,节点 1 数据无法同步到节点 2,节点 2 上的数据 X 还是 1。这是客户端访问节点 2 获取数据 X 时,收到是正常的响应,旧数据 X = 1,而实际上当前最新的数据 X 已经是 2 了,这里就不满足一致性的要求了,因此在 CAP 定理只能满足 AP。

同样适合 AP 的场景有很多,比如一些查询系统,电商系统的商品查询等,大多数为了保证系统的可用性,而牺牲一定的数据一致性,这样也保证了用户体验,在开源界中采用 AP 模型的典型应用有 Eurka,Cassandra。

必须三选二吗

提到了 CAP 定理,大多数人都认为无论什么情况,分布式系统只能在 C 和 A 中选择一个。但这里的前提是系统发生了网络分区情况,如果系统没有发生网络分区的情况,也就是说 P 不存在的时候,我们就没有必要放弃 C 或者 A,因此进行架构设计时也应该考虑没有分区情况下如何保证 CA。除此之外,一个分布式系统不一定只能从 AP 与 CP 中做选择,内部不同模块所应对的场景也不同,完全有可能是一个模块采用 AP 架构,另一个模块采用 CP 架构。作为优秀的架构师,不应该受到大多数人对 CAP 定理所认识的局限,设计出符合自身业务场景的分布式系统才是重中之重。

最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,免费分享,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

资料免费获取方式:点击这里免费领取Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料

dis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**

年末阿里百度等大厂技术面试题汇总,不可思议!相关推荐

  1. 年末阿里百度等大厂技术面试题汇总,灵魂拷问

    现在的IT行业竞争压力越来越大,尤其是Android开发行业.而很多Android程序员却每天都在重复CRUD,原地徘徊! 今年年初,你就想改变现状,于是在网上刷了大量面试题,强行记下之后,开始参加面 ...

  2. 年末阿里百度等大厂技术面试题汇总,完整版开放下载

    前言 昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法? 这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了. 她又不紧不慢的问,索引为什么就能提高查询性能. 这还用问,索引就像 ...

  3. android面试题2020!年末阿里百度等大厂技术面试题汇总,社招面试心得

    前言 1.主动学习,努力提升,与社会发展同行 在职场上工作的年限越长,就越容易形成定势思维,这也许就是思维僵势的影响.这种习惯性思维正是缩小中年人生存空间的一大原因. 随着新行业.新技术的出现,要想不 ...

  4. 年末阿里百度等大厂技术面试题汇总,原理+实战+视频+源码

    前言: Android 应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的形势来看,Android开发相当火热,但是高级Android开发人才却比较少,现在移动互联网的开发者也逐步开始关注插 ...

  5. 被大佬问到自闭!年末阿里百度等大厂技术面试题汇总,帮你突破瓶颈

    前言 首先介绍一下自己,计算机水本,考研与我无缘.之前在帝都某公司算法部实习,公司算大公司吧,然而个人爱好偏开发,大二的时候写个一个app,主要是用各种框架. 程序员职业发展路径有哪些选择? 我们再说 ...

  6. 2021年阿里、腾讯、字节等大厂技术面试题汇总,西安富士通Java笔试题

    finalize的工作原理 一个对象的创建过程 对象的销毁是按照创建的逆序来进行的 final的方法和类都不允许覆盖和继承.private默认实现了final. 简述jvm中默认的classLoade ...

  7. 阿里技术面试题汇总,“跳槽”就靠它了(文中附答案)

    以下为整理的2019阿里技术面试题及部分答案,详细答案可在文末获取! · 如何实现一个高效的单向链表逆序输出? 部分参考答案 typedefstructnode{intdata;structnode* ...

  8. 21年Android面经分享,大厂面试题汇总

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18pwlQoG-1617948354515)(//upload-images.jianshu.io/upload_ima ...

  9. 腾讯+阿里+百度Java高频面试题(涵盖了年薪20W80W的高频面试题)

    性能优化面试专栏 tomcat性能优化整理 1.你怎样给tomcat调优 2.如何加大comcat连接数 3.怎样加大tomcat的内存 4.tomcat中如何禁止列目录下的文件 5.Tomcat有几 ...

最新文章

  1. CVPR 2021 比CNN和Transformer更好的Backbone?伯克利谷歌提出BoTNet,精度达84.7%
  2. 富文本编辑器---笑脸表情(一)
  3. h5调用摄像头拍照可以自定义拍照页面吗_回归单摄时代?小米伸缩式摄像头技术曝光,网友:好家伙...
  4. 用c语言设计如何扩充道路信息,【2017年整理】C语言设计(本)阶段练习四.doc
  5. MultipartResolver
  6. go-zero:微服务框架
  7. Python 学习拾遗
  8. 分布式与人工智能课程(part14)--深度学习
  9. mysql8 win10启动_Windows10 mysql 8.0.12 非安装版配置启动方法
  10. Http与WWW服务精解
  11. php codeigniter ext,php – 私有服务器上CodeIgniter不正确的系统路径
  12. 小程序页面跳转的几个方法和区别
  13. 获取少女资源.html,战舰少女资源怎么得 资源来源汇总
  14. [转载] Python: struct 模块之字节对齐问题
  15. 在Win10中通过Google Chrome运行安卓应用
  16. 汽车零部件开发工具巨头V公司全套应用层UDS协议栈源代码
  17. Excel VBA 高级编程-工资条模板考勤工资管理系统
  18. html手机端最小字体,移动端最小字体限制测试
  19. 想知道程序员每天在干嘛吗?
  20. shame on u

热门文章

  1. 2021-2025年中国定时控制器行业市场供需与战略研究报告
  2. java怎样才算高级_怎样才算是一名java高手?
  3. java linklist 遍历_Java LinkList遍历方式
  4. php模拟post方法
  5. Serverless 全能选手,再添一“金”
  6. RubikFX:用JavaFX 3D解决魔方难题
  7. “我的代码正在被千百万人使用”,MySQL 之父等六大国际数据库掌门人谈如何做数据库
  8. 为什么机器学习很难学习因果关系?
  9. 我,对安全研究专家下手的黑客!
  10. 告别 996,解放开发者,一站式 AI 开发平台助力 AI-Native 时代