• redisson分布式锁


    RLock官网解释

            基于Redis的Java分布式可重入锁对象,实现了锁接口。

            如果获得锁的Redisson实例崩溃,那么这种锁可能永远挂起在获得状态。为了避免这种情况,Redisson维护了锁看门狗,它在锁持有者Redisson实例活着的时候延长锁过期时间。默认情况下,看门狗的超时时间为30秒,可以通过配置进行修改。lockWatchdogTimeout设置。

            可以定义锁获取期间的leaseTime参数。在设定的时间间隔后,锁自动释放。

            RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程可以解锁它,否则将抛出IllegalMonitorStateException。否则考虑使用RSemaphore对象。

    总结下来就是

    • 特性:可重入锁
    • 看门狗默认时间:30秒
    • 释放锁时要关注当前线程是否拥有锁
    1. //获取锁对象
    2. RLock lock = redisson.getLock("myLock");
    3. //传统加锁方法
    4. lock.lock();
    5. //或者获得锁并在10秒后自动解锁
    6. lock.lock(10, TimeUnit.SECONDS);
    7. //加锁阻塞等待时间100秒,且获得锁10秒后自动释放锁
    8. boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
    9. if (res) {
    10. try {
    11. ...
    12. } finally {
    13. lock.unlock();
    14. }
    15. }

    自定义的锁方法

    1. /**
    2. * 获取锁
    3. * @param lockName
    4. * @return
    5. */
    6. public static RLock getLock(String lockName){
    7. RLock rLock = redissonClient.getLock(lockName);
    8. if(rLock.isLocked()){
    9. return null;
    10. }
    11. rLock.lock(default_lease_time, TimeUnit.SECONDS);
    12. return rLock;
    13. }
    14. /**
    15. * 获取锁
    16. * @param lockName
    17. * @param waitTime 阻塞时间(秒)
    18. * @return
    19. */
    20. public static RLock getLock(String lockName, long waitTime){
    21. RLock rLock = redissonClient.getLock(lockName);
    22. try {
    23. boolean resp = rLock.tryLock(waitTime, default_lease_time,TimeUnit.SECONDS);
    24. if(resp){
    25. return rLock;
    26. }
    27. } catch (InterruptedException e) {
    28. e.printStackTrace();
    29. }
    30. return null;
    31. }
    32. /**
    33. * 释放锁
    34. * @param lock
    35. */
    36. public static void unlock(RLock lock){
    37. if(ObjectUtils.isEmpty(lock)){
    38. return;
    39. }
    40. if(!lock.isLocked()){
    41. return;
    42. }
    43. lock.unlock();
    44. }

    除此,官网还有其他几个所对想,具体参考redisson

  • 相关阅读:
    UBOOT编译--- make xxx_deconfig过程详解(一)
    接口设计与优化
    Es6数组扩展方法和对象扩展方法
    组合控件——顶部导航栏——工具栏Toolbar
    1150:求正整数2和n之间的完全数
    14. UE5 RPG使用GameplayTag
    关于效能分析的pwr 方差分析
    计算机视觉40例之案例16KNN英文字母识别
    【Matplotlib绘制图像大全】(二十八):Matplotlib使用imshow()可视化图像
    qemu 运行 linux
  • 原文地址:https://blog.csdn.net/lizsy/article/details/132696052