前言

我在知乎上看到这样一个话题,关于程序员的:

听同学说干码农这行每天都要加班,这样的话,不就没精力做别的事情了。有个师兄做 IT 销售,不太辛苦,生活还算是美滋滋,是真的吗?我也知道社会上干哪一行都不容易,可是好像码农生活确实单调无聊。天天敲代码,日常嗨一嗨都没时间,更别说有精力谈恋爱了。想问问正在工作的各位前辈,你们的生活是怎么样的?

开门见山、开诚布公地说吧,我是一个对技术没有很大热情的程序员。这样说会不会遭到一些同学们的 DISS?不管了,反正我知道一不小心又甩了两个成语,感觉自己挺有才华的。你们要是枯燥地笑了,请在文末给我一个大大的赞。

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。

普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题。

如何控制呢?就是设置一个各个线程都能看的见的标志。然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域。如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待。

这个标志,就是锁。

在单机多线程的java程序中,我们可以使用堆内存中的变量作为标志,因为多线程是共享堆内存的,堆内存中的变量对于各个线程都是可见的。

讲明白了普通的锁,接下来,我们再看看分布式锁。

在分布式环境下,即多台计算机,每个计算机上会启动jvm执行程序的运行环境下,如果不同计算机上的线程想访问临界区域时,该怎么办呢?

前面普通锁的使用堆内存中的变量的方式肯定不适用了。因为在多机环境下,某台计算机上的堆内存中的变量对于其他计算机上的线程肯定是不可见的。那么,根据锁的本质和原理,我们就要找到另外的对于多机上的线程都可见的标志,以它来作为锁,就可以了。这样的锁,就是分布式锁。

当然,这里只是解释了什么是分布式锁,至于分布式锁该如何实现,其实有多重方式,关键在于要保证锁对多机上的程序是可见的即可。一些常用的实现方式是,使用redis,使用数据库等等。

为什么要使用分布式锁

我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

分布式锁应该具备哪些条件

在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

  • 1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;

  • 2、高可用的获取锁与释放锁;

  • 3、高性能的获取锁与释放锁;

  • 4、具备可重入特性;

  • 5、具备锁失效机制,防止死锁;

  • 6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

分布式锁的三种实现方式

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。

  • 基于数据库实现分布式锁;

  • 基于缓存(Redis等)实现分布式锁;

  • 基于Zookeeper实现分布式锁;

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

完整版获取:狂戳这里免费领取~

《Java高级面试》

《Java高级架构知识》

《算法知识》

《Java高级架构知识》

[外链图片转存中…(img-OPQzn1sa-1623055031529)]

《算法知识》

由浅入深!原来SqlSession只是个甩手掌柜?分享面经相关推荐

  1. java区块链开发教程,原来SqlSession只是个甩手掌柜

    前言 我们在执行Sql之前,需要先获取SqlSession对象,但是我们也提到了SqlSession下面还有四大对象,所以SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象: ...

  2. 原来SqlSession只是个甩手掌柜?真正干活的是谁?

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:双子孤狼 blog.csdn.net/zwx90010 ...

  3. 【MyBatis系列7】原来SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象

    Executor原理分析 前言 MyBatis架构分层 Executor BaseExecutor SimpleExecutor ReuseExecutor BatchExecutor 三种常用批量插 ...

  4. 原来SqlSession只是个甩手掌柜?全网疯传

    前言 小编看过很多讲Git的文章但感觉还是不够详细,所以出现了这篇文章. 今天来说一说Git命令全方位学习 文章目录 Git是什么? Git的相关理论基础 日常开发中,Git的基本常用命令 Git进阶 ...

  5. 原来SqlSession只是个甩手掌柜?不可思议!

    梳理知识点,是快速提升技术的关键 前面讲过,快速提升自己的技术硬实力其实是有方法的.大致就是梳理知识点+夯实基础+进阶深入学习+实战,下面我会一点点跟大家剖析,本文干货满满,大家仔细阅读. ①梳理知识 ...

  6. 原来SqlSession只是个甩手掌柜?互联网行业“中年”危机

    一.前言 最近刚读完一本书:<Netty.Zookeeper.Redis 并发实战>,个人觉得 Netty 部分是写得很不错的,读完之后又对 Netty 进行了一波很好的复习(之前用 sp ...

  7. Java程序员面试常问的问题,原来SqlSession只是个甩手掌柜

    PS:doFlushStatements方法在BaseExecutor中的commit(),rollback(),close()方法中会被调用(即:事务提交,事务回滚,事务关闭三个方法). Batch ...

  8. 原来SqlSession只是个甩手掌柜,看完我工资从12K变成了20K

    BatchExecutor从名字上也可以看出来,这是一个支持批量操作的执行器. 如果说大家都用过jdbc就知道,jdbc是支持批量操作的,有一个executeBatch()方法用来执行批量操作,但是有 ...

  9. 原来SqlSession只是个甩手掌柜,高级面试题+解析

    前言 阿里巴巴,作为国内互联网公司的Top,算是业界的标杆,有阿里背景的程序员,也更具有权威性.作为程序员,都清楚阿里对于员工要求有多高,技术人员掌握的技术水平更是望尘莫及.所以,大厂程序员的很多经验 ...

最新文章

  1. 深度学习 vs. 概率图模型 vs. 逻辑学
  2. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型
  3. Android System分区大小异常
  4. Spring Boot中的缓存支持(二)使用Redis做集中式缓存
  5. Java Random nextInt()方法与示例
  6. 利用python绘制雪景图_用AI绘制冬季雪景森林场景插画图片
  7. Small game written by Python 2021/1/7
  8. 283.移动零 (力扣leetcode) 博主可答疑该问题
  9. r型聚类分析matlab实现,浅谈Matlab中的聚类分析 Matlab聚类程序的设计
  10. java实训计算器总结_java实训报告--计算器
  11. 对称加密密码 对称加密算法
  12. jwplayer播放器
  13. c语言的log算法实现,C语言中有关log函数的算法
  14. 面试题:CSS3实现折角效果
  15. 企业如何管理终端软件安装
  16. 微型计算机不可少,[单选] 微型计算机中必不可少的输入和输出设备是()。
  17. 1138:破解简单密码
  18. 知网CAJ论文 如何转换成pdf
  19. 自动化测试-数据驱动
  20. Python聊天室设置与实现

热门文章

  1. 如何辨别梭织、针织和无纺面料?
  2. 解析MySQL binlog --(5)ROWS_EVENT:WRITE_ROWS_EVENT、UPDATE_ROWS_EVENT、DELETE_ROWS_EVENT
  3. STC8H8K系列汇编和C51实战——实现键控不同方式数码管动态显示(C51版和汇编版)
  4. 通达信超跌反弹选股公式,使用筹码函数WINNER
  5. 关于影像exif信息保存的问题
  6. PHP 数组操作方法
  7. 解决 RtlCreateActivationContext() failed 0xc000000d
  8. 华硕也开始做开源硬件了---tinkerboard卡片电脑主板
  9. 下载YouTube视频最简单的方式
  10. 第五 字符串和格式化输入/输出