文章目录
1.Why?
1.1为什么选择分布式锁,而不是其他的锁?
下面就来说一下分布式锁的由来:
线程锁
在单机系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,为了保证在同一时刻仅有一个线程执行该方法或该代码段,主要通过给方法、代码块加锁来实现。当某个方法或代码使用锁,线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等。
进程锁
为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。
分布式锁
此处主要是集群模式,多个相同服务同时开启。
在分布式系统中,分布式与单机情况下最大的不同在于其不是多线程而是多进程。
多线程由于可以共享堆内存,因此可以简单的采取内存作为标记存储位置。而进程之间甚至可能都不在同一台物理机上,因此需要将标记存储在一个所有进程都能看到的地方。
当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。
分布式锁也可以将标记存在内存,只不过是这个内存不再是某个进程分配的内存,而是公共内存,如zookeeper,redis,数据库等。