分布式锁产生原因:
当某个资源(不指变量,可能是某个文件等)被多个进程访问时,怎么办?
(非分布式为什么不会出现这个问题?非分布式你在使用共享资源时,使用java锁即可解决。但多个进程访问这个资源时,彼此进程的java锁并不通用,所以才会在分布式中产生锁的问题)
1、数据库insert,delete操作(麻烦,问题还不少)
2、利用数据库自身的排它锁(select * from atable where name=*** for update)
3、利用缓存,如redis来实现
但总体来说,会存在以下几个问题:
1、没有失效时间,时间久了会有资源耗尽的时候
2、非阻塞,可能得使用while来不断监控
3、非可重入。一个线程获得了锁,在后续操作该资源中需要不断判断是否是该锁的主人
解决好方案:zookeeper
参考文档:分布式锁原理
zookeeper:
1、官网
2、好的文章:写得非常好,zookeeper入门