分布式锁实现

Posted ly570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式锁实现相关的知识,希望对你有一定的参考价值。

我们已经知道可以通过Redis自带的函数setNX来实现分布式锁,具体实现步骤如下。

我在一台CentOS7的linux虚拟机中安装了Redis服务,ip地址为:192.168.246.130,服务端口为:6379。

下面是java通过redis实现分布式锁的例子:

import redis.clients.jedis.Jedis;
public class RedisLock
//锁的key
private static final String key = "DistributedRedisLock";
private static Integer count = 0;
public static void main(String[] args)
for(int i=0;i<1000;i++)
new Thread(new Runnable()
@Override
public void run()
//获取Redis连接
Jedis jedis = new Jedis("192.168.246.130", 6379);
try
while(true)
//获取锁
if(jedis.setnx(key, Thread.currentThread().getName()) == 1)
try
System.out.println("线程("+Thread.currentThread().getName()+")获取到锁,开始执行操作");
count++;
System.out.println(count);
break;
finally
System.out.println("操作执行完成,释放锁");
//操作执行完一定要释放锁,所以在finally块中执行
jedis.del(key);

else
//返回的不是1,说明已经有某个线程获取到了锁
try
//等待100毫秒之后重试
Thread.sleep(100l);
catch (InterruptedException e)
e.printStackTrace();



catch(Exception e)
e.printStackTrace();
finally
//释放Redis连接
jedis.disconnect();


).start();



 

上述代码的输出结果为:

线程(Thread-320)获取到锁,开始执行操作

1

操作执行完成,释放锁

线程(Thread-463)获取到锁,开始执行操作

2

操作执行完成,释放锁

线程(Thread-997)获取到锁,开始执行操作

3

操作执行完成,释放锁

...

线程(Thread-409)获取到锁,开始执行操作

998

操作执行完成,释放锁

线程(Thread-742)获取到锁,开始执行操作

999

操作执行完成,释放锁

线程(Thread-286)获取到锁,开始执行操作

1000

操作执行完成,释放锁

上述代码虽然是在单应用多线程情况下测试的,但即便是在分布式环境下多应用多线程去获取锁,结果依然是正确的。
---------------------

以上是关于分布式锁实现的主要内容,如果未能解决你的问题,请参考以下文章

分布式锁,及Redis实现分布式锁

Redis实现分布式锁与Zookeeper实现分布式锁区别

分布式锁实现及常见问题

大厂面试题详解:如何用Redis实现分布式锁?

分布式锁及其常见实现方式

分布式锁三种分布式锁的实现转载