做公众号封面图的网站,重庆永川网站建设价格,都江堰seo,外贸营销网什么是分布式锁#xff1f;在回答这个问题之前#xff0c;我们先回答一下什么是锁。
普通的锁#xff0c;即在单机多线程环境下#xff0c;当多个线程需要访问同一个变量或代码片段时#xff0c;被访问的变量或代码片段叫做临界区域#xff0c;我们需要控制线程一个一个…什么是分布式锁在回答这个问题之前我们先回答一下什么是锁。
普通的锁即在单机多线程环境下当多个线程需要访问同一个变量或代码片段时被访问的变量或代码片段叫做临界区域我们需要控制线程一个一个的顺序执行否则会出现并发问题。
如何控制呢就是设置一个各个线程都能看的见的标志。然后每个线程想访问临界区域时都要先查看标志如果标志没有被占用则说明目前没有线程在访问临界区域。如果标志被占用了则说明目前有线程正在访问临界区域则当前线程需要等待。
这个标志就是锁。
在单机多线程的java程序中我们可以使用堆内存中的变量作为标志因为多线程是共享堆内存的堆内存中的变量对于各个线程都是可见的。
讲明白了普通的锁接下来我们再看看分布式锁。
在分布式环境下即多台计算机每个计算机上会启动jvm执行程序的运行环境下如果不同计算机上的线程想访问临界区域时该怎么办呢
前面普通锁的使用堆内存中的变量的方式肯定不适用了。因为在多机环境下某台计算机上的堆内存中的变量对于其他计算机上的线程肯定是不可见的。那么根据锁的本质和原理我们就要找到另外的对于多机上的线程都可见的标志以它来作为锁就可以了。这样的锁就是分布式锁。
当然这里只是解释了什么是分布式锁至于分布式锁该如何实现其实有多重方式关键在于要保证锁对多机上的程序是可见的即可。一些常用的实现方式是使用redis使用数据库等等。
为什么要使用分布式锁
我们在开发应用的时候如果需要对某一个共享变量进行多线程同步访问的时候可以使用我们学到的Java多线程的18般武艺进行处理并且可以完美的运行毫无Bug
注意这是单机应用也就是所有的请求都会分配到当前服务器的JVM内部然后映射为操作系统的线程进行处理而这个共享变量只是在这个JVM内部的一块内存空间
分布式锁应该具备哪些条件
在分析分布式锁的三种实现方式之前先了解一下分布式锁应该具备哪些条件 1、在分布式系统环境下一个方法在同一时间只能被一个机器的一个线程执行 2、高可用的获取锁与释放锁 3、高性能的获取锁与释放锁 4、具备可重入特性 5、具备锁失效机制防止死锁 6、具备非阻塞锁特性即没有获取到锁将直接返回获取锁失败。
分布式锁的三种实现方式
目前几乎很多大型网站及应用都是分布式部署的分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性Consistency、可用性Availability和分区容错性Partition tolerance最多只能同时满足两项。”所以很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中都需要牺牲强一致性来换取系统的高可用性系统往往只需要保证“最终一致性”只要这个最终时间是在用户可以接受的范围内即可。
在很多场景中我们为了保证数据的最终一致性需要很多的技术方案来支持比如分布式事务、分布式锁等。有的时候我们需要保证一个方法在同一时间内只能被同一个线程执行。 基于数据库实现分布式锁 基于缓存Redis等实现分布式锁 基于Zookeeper实现分布式锁
总结
谈到面试其实说白了就是刷题刷题刷题天天作死的刷。。。。。
为了准备这个“金三银四”的春招狂刷一个月的题狂补超多的漏洞知识像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
并且我也将自己刷的题全部整理成了PDF或者Word文档含详细答案解析有需要的朋友可以戳这里即可免费领取 66个Java面试知识点
架构专题MySQLJavaRedis线程并发设计模式NginxLinux框架微服务等大厂面试题详解百度阿里腾讯华为迅雷网易中兴北京中软等 算法刷题PDF
北京中软等**
[外链图片转存中…(img-nzh8KYkZ-1624875736411)]
算法刷题PDF