分布式锁
什么是锁?为什么需要用到锁?
从需求的角度看,在并发场景中经常会发生多个线程对同一个数据同时发起读写操作,如果不加以限制就会发生并发修改异常,以及线程之间数据的不一致情况。
而为了解决这种情况,需要限制在某一时刻只能有一个线程对数据进行读写操作,主要是写,读的话还是可以允许多线程同时的。
限制的方法就是将可能发生并发场景的代码用锁锁起来,也叫同步代码块,锁的部分可以分很多种,锁类,锁方法,锁某几行代码,锁变量等。
锁具体是什么呢,个人理解就是一个整个应用程序中的所有线程都认可的唯一标识,获取该唯一标识就可以获得执行权,如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

浙公网安备 33010602011771号