单锁与分布式锁
1.单锁:
单锁与分布式锁指的实质上是使用设备的数量。顾名思义,单锁只能对单个设备进行上锁,多个设备就会出现问题,也就是说单锁的作用范围就在本机内,如果本机外完成与本机相同的操作,那么本机的锁自然是锁不到本机范围之外的主机。简单来说就是单锁的作用范围较小。
单锁的意义,锁的作用就是在进程或线程并行出错的情况下增加限定,让这部分工作退化为串行避免出错。所以,简单来讲,锁的作用就是为了避免并发问题。
单锁的局限:刚才讲了,单锁作用域为本机,而现在的项目体量越来越大,后端服务器可以有多个服务器进行拼接,再通过类似于nginx服务器来进行反向代理实现负载均衡。
也就是说,多个主机都需要执行相同的代码,假设目前代码段A需要上锁,而在分布式服务器部署的情况下使用单锁,比如synchronized,此时服务器1、2、3都第一次接收到相同的指令(完成代码段A的操作),此时由于synchronized的作用域限制,服务器1、2、3完成了获取锁,显然出现了并发问题。
归根结底,synchronized无法适应分布式服务器的原因就是其作用域为其主机对应的JVM。
2.要解决单锁的限制,很简单的联想到,我们不把锁丢给JVM不就行了吗?所以redis分布式锁就出现了。
不谈redisson,我们讲最简单的基于redis的锁如何实现。
再redis中我们有语句setnx,那么我只需要使用setnx即可完成上锁,比如某个功能A需要上锁,那么可以简单的使用语句:setnx lock:A lock来进行上锁。
当其余线程访问这个redis缓存时,也是用setnx lock:A lock,这个语句的返回类型为布尔类型,所以可以简洁的判断是否获取到锁。
释放锁也很方便,只需要讲缓存删掉即可。