博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis分布式锁
阅读量:5876 次
发布时间:2019-06-19

本文共 2244 字,大约阅读时间需要 7 分钟。

1. 在多线程并发的场景下,使用锁来控制多个任务对同一共享资源的访问,拿到锁的任务优先访问公共资源

//并发的用户数

private static final int threadNum = 10;

//倒计数器(发令抢),用于制造线程的并发执行

private static CountDownLatch cdl = new CountDownLatch(threadNum);

 

public void run(){

  try{

    cdl.await();//线程运行到这里等待,等待发令枪计数器变为0

  }catch(InterruptedException e){

    e.printStackTrace();

  }

  //线程结束后,所有线程同时执行换行给printer 发送打印指令

  Printer.print(Thread.currentThread().getName()+"");

}

public static void main(String[] args){

  for(int i=0;i<threadNum;i++){

    new Thread(new PrintTask("sssssss")).start();

    cdl.countDown();

  }

}

///以上存在线程安全问题:

1. 使用 synchronized

public void run(){  try{    cdl.await();//线程运行到这里等待,等待发令枪计数器变为0  }catch(InterruptedException e){    e.printStackTrace();  }  //同步    synchronized(cdl){  Printer.print(Thread.currentThread().getName()+"");   }  }

 2. 线程加锁

private Lock lock=new ReentrantLock(); public void run(){  try{    cdl.await();//线程运行到这里等待,等待发令枪计数器变为0  }catch(InterruptedException e){    e.printStackTrace();  }  //  lock.lock();   try{
    Printer.print(Thread.currentThread().getName()+""); }catch(Exception e){
       }finally{     lock.unlock();   }}

 

redis分布式锁

public class RedisLock implements Lock{

  private static final String LOCK_KEY="lock";

  private ThreadLocal<String> local=new ThreadLocal<String>();//线程传值

  //阻塞时锁

  public void lock(){

    if(tryLock()){

      return;

    }else{

      Thread.sleep(200);  //使用trycatch包围

      lock();

    }

  }

  //非阻塞锁

  public boolean tryLock(){

    String uuid=UUID.randomUUID().toString();

    Jedis redis=new Jedis("localhost");

    String ret = redis.set(LOCK_KEY,uuid,"NX","PX",100);

    if(ret!=null&&ret.equals("OK")){

      local.set(uuid);

      return true;

    }

    return false;

  }

  //解锁

  public void unlock(){

    String script=FileUtils.readFileByLines("lua脚本文件地址");  //读取lua脚本文件

    Jedis redis=new Jedis("localhost");

    List<String> keys=new ArrayList<String>();

    keys.add(LOCK_KEY);

    List<String> args=new ArrayList<String>();

    keys.add(local.get());//get  uuid

    redis.eval(script,keys,args);

  }

 

}

lua脚本

if redis.call("get",KEYS[1])==ARGV[1] then

  return redis.call("del",KEYS[1])

else

  return 0

end 

 ========================redis加锁==============================================

 

 

 

 

 

 

 

转载地址:http://blzix.baihongyu.com/

你可能感兴趣的文章
ansible 基本操作(初试)
查看>>
更改tomcat的根目录路径
查看>>
51nod 1292 字符串中的最大值V2(后缀自动机)
查看>>
加快ALTER TABLE 操作速度
查看>>
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
基本网络概念
查看>>
将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1 RC 1
查看>>
js提交图片转换为base64
查看>>
学习CodeIgniter框架之旅(二)继承自定义类
查看>>
Y2161 Hibernate第三次考试 2016年8月18日 试卷分析
查看>>
Angular CLI 使用教程指南参考
查看>>
PHP 程序员的技术成长规划
查看>>
用于守护进程的出错处理函数
查看>>
AppCan可以视为Rexsee的存活版
查看>>
【转】SQL SERVER 2005 数据库状态为“可疑”的解决方法
查看>>
事件、委托、委托方法的总结(使用EventHandler<>)
查看>>
Revit API 创建带箭头的标注
查看>>
jetty启动报错Unsupported major.minor version 51.0
查看>>
Xamarin.Android开发实践(七)
查看>>
彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代...
查看>>