? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if (jedis != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? pool.returnResource(jedis);// 还到连接池里
? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
犀利用法
用匿名类来实现,代码非常简洁
至于SimpleLock的实现,请在我附件中下载查看
? ? ? ? SimpleLock lock = new SimpleLock(key);
? ? ? ? lock.wrap(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? //此处代码是锁上的
? ? ? ? ? ? }
? ? ? ? });
附件是分布式锁的完整实现和用法,有需要交流的朋友,可以随时留言。
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/1月/15日/Java并发:分布式锁
------------------------------------------分割线------------------------------------------
因为JAVA的实现和伪代码的实现有所不同,所以仔细对比了一下
伪代码是通过? 当前时间? 和? getset返回的库里面的时间对比? 判断谁应该拿到锁。
JAVA实现是通过 对比两次get 和 getset的返回值的不同,来判断谁应该拿到锁。
两种实现在大多数情况都不会出问题,但是也有失败的情况
1,伪代码失效的情况是 设置超时时间和get的网络开销不相上下的时候。这样容易让一行三次获取数据最后导致成功,很容易让锁失效,替代前一个锁,不过这不算问题,因为设置过小的锁超时时间本身就是程序bug,而且就算这种情况也可以保证每个获取锁的节点依次的进入锁。
2,JAVA实现的失效的情况是,两台完全同步的机器,每步代码执行的速度都一样,有可能让多个节点同时拿到锁。
个人比较赞同伪代码中的实现。
原因是伪代码 如果超时时间设置合理的话,后续的节点最多会把超时时间延迟个几个毫秒,但是后续的节点都不会拿到锁。