需求分析:
- 在分布式环境下,sychronized关键字并不能起到对资源加锁的作用,因为sychronized只能在同一个JVM中起作用,因此需要设计适合分布式应用部署的分布式并发锁,保证各个应用对同一资源的访问仍然有序进行
- SSDB能对分布式应用提供统一的基于内存的存储服务,而且性能很高,因此可被用来设计分布式锁,当然Redis也可以
详细设计:
- 基础:SSDB操作是单线程的,并且是原子的,因而不会有并发干扰问题,所有访问都是串行的
- 原理:
- 核心就是利用ssdb的incr操作,当第一个线程A来访问资源的时候,对key进行incr操作(此时key在ssdb中并没有值),结果为1,可以访问
- 再有线程B来访问资源时,如果第一个线程A还没有释放锁(del(key)),这时进行incr操作结果将大于1,表示资源已被锁住,不可访问
- 接下来线程B就每间隔一段时间循环执行incr操作,当第一个线程A释放锁(del(key))后,incr操作将返回1,此时获得锁,就可访问资源了
- 如下图所示
- 需注意的地方
- 为防止意外原因导致线程锁住资源不放,每次incr(key)获得结果为1后,需要对key设置过期时间(ssdb.