synchronized 关键字 和 lock 方法都是一般的锁,都不适合分布式项目。
synchronized 是基于JVM的,所以它是由JVM负责关闭的,而Lock是代码级别的,需要我们手动的去unLock,释放锁的资源。
分布式锁我们需要借助redis的特性去实现。
redis中的setnx() 方法能很好的实现加锁功能,因为它能确保保存到redis中的key的唯一性。
生成分布式锁的步骤:
1. 生成一个唯一性的key,确保每次操作的key都是唯一的,不重复。(hash散列算法,MD5加密)
2. 调用setnx(key)。
a. 非阻塞型的锁,如果返回值为false,也就是获取锁不成功,则放弃。(没有死锁问题)
b. 阻塞型的锁,如果返回值是false人,也就是说获取锁失败,则一直等待,直到获取成功为止。(容易出现死锁)
3. 对于阻塞型的锁,我们需要为它设置一个过期时间。如果设置过期时间出现异常,必须在finilly中释放锁,避免出现死锁。
4. 考虑到性能问题,阻塞锁容易出现大量线程处于等待状态,所以要制定一个优先级算法,进行相对公平的获取锁。
5. 一般为了提高系统的性能,会用到DCL(双重锁检测)策略,先进行代码级别的判断,然后进行锁的判断,毕竟锁的校验是非常消耗性能的。