分布式锁

什么是锁?为什么需要用到锁?

  从需求的角度看,在并发场景中经常会发生多个线程对同一个数据同时发起读写操作,如果不加以限制就会发生并发修改异常,以及线程之间数据的不一致情况。

  而为了解决这种情况,需要限制在某一时刻只能有一个线程对数据进行读写操作,主要是写,读的话还是可以允许多线程同时的。

  限制的方法就是将可能发生并发场景的代码用锁锁起来,也叫同步代码块,锁的部分可以分很多种,锁类,锁方法,锁某几行代码,锁变量等。

  锁具体是什么呢,个人理解就是一个整个应用程序中的所有线程都认可的唯一标识,获取该唯一标识就可以获得执行权,如redis中就可以是一个key-value

  基本过程就是:获得锁之后执行代码,执行完成之后再释放锁,让下一个线程继续使用。

什么是分布式锁?

  分布式锁就是完成业务的线程分布在不同的机器,需要一个整个应用程序(涉及多台服务器)都认可的唯一标识来作为锁,redis可以对相关的服务器提供该服务。

 

分布式锁的实现思路

方案:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。

分布式锁的基本条件

  1、互斥性。在任意时刻,只有一个客户端能持有锁。

  2、不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。

  3、具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。

  4、解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。

参考 :https://www.cnblogs.com/moxiaotao/p/10829799.html

分布式锁实现例子

  一种使用redis实现的方式 https://www.cnblogs.com/happy4java/p/11205993.html

posted @ 2021-02-24 23:56  karbon  阅读(90)  评论(0)    收藏  举报