热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

面试常问之~悲观锁和乐观锁

我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,

   


 


        我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,只是很多东西,我们常用,但是没有深入去了解或者不能再面试时候给出官方的解释(这一点我真的很烦)下面就悲观锁和乐观锁给出我的理解,当然我也是面试经常会被问到,我一般都是按照自己理解去回答 ,从来不去官方解释(每个人不一样,只要大家觉得适合自己的就行.)

  一般面试官会从和几个点问你:

       1.什么是锁? 


       2.你知道悲观锁和乐观锁?

       3.你可以大概简单讲一下你的理解? 

  一般这三个问题是层层递进的,一般问道锁了 就心里要想了 ,千万不要不懂装懂,一定把自己最拿手最熟悉的说出来.好啦,进入正题.

   一: 首先理解锁:

              我的认为:锁的出现必定是因为并发才会有的东西,因为在并发的情况下,锁是来控制多个操作顺序,保证数据安全变动的一个很好的东西,锁一般最多是在: 多线程中的锁  和  数据库的锁.

比如在数据库层,一个表中同一个数据,同时多个修改操作过来,那数据库就会给表钟该行数据上锁,通常也叫行锁.我们今天说的悲观锁以及乐观锁是基于数据库层面的,跟程序中的多线程中的锁是不一样的.

       悲观锁:

              从字面意思来看,这家伙就是很悲观,我更喜欢叫它谨慎锁.从数据库层来讲:


1.去拿数据,会认为在此同时会有人也来动这个数据,所以它就会上锁.


2.这样,别人要是也操作这个数据,就需要它那边完事,释放锁之后.


   这个机制其实对应于我们常说你的    行锁 表锁  读锁  写锁 

  

乐观锁

      就是很乐观,我一般叫大意锁.从数据库层来讲:


 1.去拿数据,会认为在此同时不会有人也来动这个数据,所以它就不会上锁.


2.但是,不上锁不代表就会不负责,一般在最后更新数据的时候,一般使用版本号来处理.(问版本号如何处理?


         乐观锁通常是通过在表中增加一个版本或时间戳来实现,一般常用版本。

 例如:

   A操作数据库数据时候 

 1. 从数据库中取数据时附带了版本号 

 2. A操作后对数据有变动最后想要将其存到表中时,这个时候会将之前取出的数据中的版本号与数据库表中最新的版本号相对比,

 3.  如果两版本一样,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许A操作对表中的数据进行修改成功,同时会将版本号进行+1操作

 4. 如果不相等,那就证明有人动过该数据,就不准A操作成立,让其重新操作一遍.

 好啦,到这里 你会发现 他们两个虽然最后都保证了数据的安全,但是,如果一个数据被修改的情况很少,我们使用悲观锁每一次加锁势必耗时,所以,场景就出来了,一般的话乐观锁适用于写比较少的情况下,悲观锁适用于读比较少的情况下.


推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
author-avatar
毕老爷666
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有