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

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

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

这个标志,就是锁。

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

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

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

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

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

为什么要使用分布式锁

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

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

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

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

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

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

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

  • 4、具备可重入特性;

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

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

分布式锁的三种实现方式

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

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

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

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

  • 基于Zookeeper实现分布式锁;

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再免费分享一波我的Java面试真题+视频学习详解+技能进阶书籍

点击这里即可免费获取以上我收集整理的全部学习资料

里即可免费获取以上我收集整理的全部学习资料](https://gitee.com/vip204888/java-p7)**

Java实战视频bilibili相关推荐

  1. 《JVM系列,Java实战视频下载

    因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行. JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令. PC寄存器为什么被设定为 ...

  2. JAVA实战——视频管理系统构建common, pojo, mapper和service工程

    QQ 1274510382 Wechat JNZ_aming 商业互捧 QQ群538250800 技术搞事 QQ群599020441 技术合作 QQ群152889761 加入我们 QQ群6493473 ...

  3. java音视频开发技术_FFmpeg音视频核心技术精讲与实战

    百度网盘2 D2 h2 i; n# o0 D# M* C! [: B1 M 第1章 学习指南[课程提供200+问题与答案库]4 a# t% {  h6 ^: E# O [你遇到的坑,别人已经出坑了,课 ...

  4. 【史上最强实战项目合集】java项目20套 +完整版java学习视频

    如果你是初学者,或者是自学者!你可以加小编微信(2782278837)!小编可以给你一些好的建议以及给你(免费)提供学习资料!你在学习上有什么问题都可以咨询小编!小编都会为你解答! 注:本公众号纯属个 ...

  5. Java从小白到大牛第4篇项目实战视频课程2——Java版QQ-关东升-专题视频课程

    Java从小白到大牛第4篇项目实战视频课程2--Java版QQ-1778人已学习 课程介绍         本项目是Java SE技术实现的QQ2006聊天工具,所涉及到的知识点:Java面向对象.L ...

  6. java实战项目视频学习

    java实战项目视频学习 视频下载:http://download.csdn.net/download/qq_35348457/10148626

  7. Java学习视频资料

    Java学习视频资料 From:https://www.bilibili.com/video/BV1KZ4y1s7WZ     (转自B站用户[倍哩倍哩]的评论) 学 Java 一直苦于没有一个学习路 ...

  8. 精选28套Java实战项目大合集

    Java项目精选合集(附源码+资料+数据库)帮助你轻松搞定毕业设计! 28套精选java实战项目,无偿分享给小伙伴哟~ 为初学者而著 适合零基础的小伙伴们学习. 感兴趣的小伙伴可以点视频链接和小编一起 ...

  9. Java实战项目《传智健康》超完整的企业级医疗行业项目

    Java实战项目<传智健康> 传智健康-企业级医疗行业项目 配套资料:https://pan.baidu.com/s/15yNdMDZtn4QDb3UA0n9zGA 视频观看:https: ...

最新文章

  1. python 用for循环生成字典_我需要创建一个for循环来生成嵌套字典
  2. mac上安装python详细教程_mac安装python环境
  3. The Distinguish of the share or static lib in MFC
  4. 微型计算机系统配置实训报告,微机配置方案设计实训报告2018
  5. 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)
  6. 路由销毁上一页_路由器原理(数据通信)
  7. 凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...
  8. tar.gz及tar.bz2两种常见格式的打包压缩及解压方法
  9. bz2解压命令_tar 命令
  10. 开源 java CMS - FreeCMS2.7 移动端栏目页静态化
  11. 【个人学习记录】RoboWare Studio安装使用
  12. unity的安装教程
  13. 计算机在线给手机杀毒,手机在线杀毒,教您手机怎么杀毒
  14. pcb板led正负极图形_晶体二极管正负极判断_晶体二极管图形符号
  15. vscode自定义消息配置
  16. win10桌面版outlook邮箱配置流程
  17. 二分答案——洛谷P2440木材加工
  18. JavaScript 常见鼠标事件
  19. 分布模型的均值与方差
  20. Python爬虫实战之爬取网站全部图片(二)

热门文章

  1. 军事卫星行业调研报告 - 市场现状分析与发展前景预测
  2. 2021-2025年中国灯光调光开关行业市场供需与战略研究报告
  3. PyTorch 功能欠缺,Meta 推出 TorchRec 来补救?
  4. Google Health将被解散,谷歌为何折戟于医疗健康?
  5. 「CSDN 2020年度博客之星」总榜单在此揭晓
  6. 专访 MindSpore 黄之鹏:围绕社区,探索开源深度学习框架的真正价值
  7. Python 玩出花了!一文教你用 Python 制作吃豆人游戏! | 附代码
  8. 为什么这款 CPU 在亚马逊上卖得最火?
  9. 任正非卸任上海华为董事;百度“云手机”今日线上发布;Inkscape 1.0 RC 版发布 | 极客头条...
  10. 不这样做,同名互踢容易踩坑!