redis redisson 普通锁示例(RLock)


redis redisson 普通锁示例

 

 

*********************

相关类及接口

 

RLock

public interface RLock extends Lock, RLockAsync {

    String getName();                     //加锁的key

    void lockInterruptibly(long var1, TimeUnit var3) throws InterruptedException;
    boolean tryLock(long var1, long var3, TimeUnit var5) throws InterruptedException;
    void lock(long var1, TimeUnit var3);  //获取锁对象,设置过期时间到期自动释放,采用此种加锁方式,可能发生任务没有完成锁就释放

    boolean forceUnlock();                //解锁
    boolean isLocked();                   //锁是否被占用

    boolean isHeldByThread(long var1);    //锁是否被指定线程占用
    boolean isHeldByCurrentThread();      //锁是否被当前线程占用

    int getHoldCount();                   //等待获取所的线程数
    long remainTimeToLive();              //所得剩余时间
}

 

Lock

public interface Lock {

    void lock();
    void lockInterruptibly() throws InterruptedException;  //加锁

    boolean tryLock();         //如果不能获得锁,立刻返回
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
                               //如果在指定的时间内不能获得锁,则立刻返回

    void unlock();             //释放锁对象
    Condition newCondition();  //获得与锁相关的condition对象
}

说明:加锁使用此接口的lock()方法,可保证正常情况下业务没有完成锁不会释放

 

RLockAsync:异步锁接口

public interface RLockAsync {

    RFuture<Void> lockAsync();
    RFuture<Void> lockAsync(long var1); //var1为线程id
    RFuture<Void> lockAsync(long var1, TimeUnit var3);   //锁超时时间
    RFuture<Void> lockAsync(long var1, TimeUnit var3, long var4);
                     //异步加锁,超时时间var1,时间单位var3,var4为线程id

    RFuture<Boolean> tryLockAsync();
    RFuture<Boolean> tryLockAsync(long var1);   //var1为线程id
    RFuture<Boolean> tryLockAsync(long var1, TimeUnit var3);  //锁超时时间
    RFuture<Boolean> tryLockAsync(long var1, long var3, TimeUnit var5);  //锁等待时间,超时时间
    RFuture<Boolean> tryLockAsync(long var1, long var3, TimeUnit var5, long var6);
                     //异步尝试加锁,等待时间var1,锁超时时间var3,时间单位var5,var6为线程id

    RFuture<Void> unlockAsync();
    RFuture<Void> unlockAsync(long var1);   //释放锁

    RFuture<Boolean> forceUnlockAsync();    //强制释放锁

    RFuture<Integer> getHoldCountAsync();   //持有锁的线程数
    RFuture<Boolean> isLockedAsync();       //锁是否被占有
    RFuture<Long> remainTimeToLiveAsync();  //所得剩余时间
}

 

 

*********************

示例

 

public class MyTest2 {

    public static void main(String[] args){
        Config config=new Config();
        config.useSingleServer().setAddress("redis://***:6379").setPassword("123456");
        RedissonClient client= Redisson.create(config);
        RLock lock=client.getLock("lock");

        ExecutorService executorService= Executors.newFixedThreadPool(5);
        for (int i=0;i<10;i++){
            executorService.submit(()->{
               try{
                   lock.lock(1, TimeUnit.SECONDS);
                   System.out.println("线程 "+Thread.currentThread().getId()+" 获得锁:"+System.currentTimeMillis());
                   Thread.sleep(4000);
               }catch (Exception e){
                   e.printStackTrace();
               }finally {
                   System.out.println("线程"+Thread.currentThread().getId()+"释放锁:"+System.currentTimeMillis());
                   lock.forceUnlock();
               }
            });
        }
        System.out.println(lock.getName());
        System.out.println(lock.getHoldCount());
    }
}

 

*********************

控制台输出

 

线程 49 获得锁:1574600045851
线程 49 释放锁:1574600049854

线程 49 获得锁:1574600049872
线程 49 释放锁:1574600053876

线程 49 获得锁:1574600053897
线程 49 释放锁:1574600057897

线程 49 获得锁:1574600057903
线程 49 释放锁:1574600061904

线程 49 获得锁:1574600061925
线程 49 释放锁:1574600065928

线程 49 获得锁:1574600065933
线程 49 释放锁:1574600069936

线程 50 获得锁:1574600069945
线程 50 释放锁:1574600073947

线程 48 获得锁:1574600073955
线程 48 释放锁:1574600077958

线程 51 获得锁:1574600077970
线程 51 释放锁:1574600081972

线程 52 获得锁:1574600081993
线程 52 释放锁:1574600085995

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个开源的内存数据存储系统,用于存储和检索数据。它是一个高性能的键值存储,支持丰富的数据类型和灵活的查询功能。RedissonRedis的一个Java客户端,提供了对Redis的封装和扩展功能。 Redisson和Jedis、Lettuce是两种不同的Redis的Java客户端。Jedis是Redis官方推出的用于通过Java连接Redis的工具包,提供了Redis的各种命令支持。Lettuce是一种可扩展的线程安全的Redis客户端,基于Netty通信框架,支持高级的Redis特性,如哨兵、集群等。 相比之下,Redisson是基于Redis、Lua和Netty构建的综合中间件,是一个成熟的分布式解决方案。Redisson不仅提供了对Redis的命令封装,还提供了分布式的Java常用对象和服务。Redisson的设计目标是提供可靠、高性能的分布式应用程序开发工具。 因此,RedisRedisson都是用于操作Redis数据库的工具,但Redisson提供了更丰富的功能和更高层次的抽象。Redisson是一个企业级开发中使用Redis的最佳范本,并被Redis官方推荐作为一种工具集。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [RedisRedisson原理详解](https://blog.csdn.net/u012060033/article/details/131154512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值