一、为什么会出现分布式锁(原理)
synchronized只能保证在一台jvm上管用,因为每台jvm机中只有一个锁监视器,只能有一条线程获取锁,当我们的项目是分布式的,放在多个服务器上,每个jvm都有各自的锁监视器,就会造成每个服务器都有一条线程获取到锁,所以造成问题出现,因此,我们需要让所有服务器共享一个锁监视器,就不会出现问题,这也就是分布式锁的价值

二、什么是分布式锁

三、分布式锁的实现

四、基于redis实现分布式锁
和redis中setnx命令相似,存在不能设置,不存在才可以设置,并且要设置key的超时时间,确保在redis出现问题时,key会超时删除,不会产生死锁

存在的问题:当线程1获取到锁,但是自己业务很慢,超过了key的过期时间,锁就自动释放了,此时线程1任务还没完成,线程2进来了,就能获取到锁,线程2处理业务时,线程1完成了,线程1就去释放锁,就把线程2的锁释放了(可能会问,为啥线程1能释放线程2的锁,他们的key不一样啊,注意:可能线程1线程2是不同jvm中的相同线程号,导致key是一样的),这时线程3又来了获取到了锁,所以综上,会出现问题,因此,解决方案:每次任务完成前释放锁时,都需要判断锁是否是自己的锁,也就是获取锁标识判断在redis中存的锁值一样不,一样就可以释放锁,像这里的业务,我们存的就是线程id为value值

改进:

