Redisson 鎖

1. 可重入鎖(Reentrant Lock)
Redisson的分佈式可重入鎖RLock Java對象實現了java.util.concurrent.locks.Lock接口,同時還支持自動過期解鎖。

public void testReentrantLock(RedissonClient redisson){

    RLock lock = redisson.getLock("anyLock");

    try{

        // 1. 最常見的使用方法

        //lock.lock();

        // 2. 支持過期解鎖功能,10秒鐘以後自動解鎖, 無需調用unlock方法手動解鎖

        //lock.lock(10, TimeUnit.SECONDS);

        // 3. 嘗試加鎖,最多等待3秒,上鎖以後10秒自動解鎖

        boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS);

        if(res){ //成功

        // do your business

        }

    } catch (InterruptedException e) {

        e.printStackTrace();

    } finally {

        lock.unlock();

    }

}


Redisson同時還爲分佈式鎖提供了異步執行的相關方法:


 
  1. public void testAsyncReentrantLock(RedissonClient redisson){

  2.     RLock lock = redisson.getLock("anyLock");

  3.     try{

  4.         lock.lockAsync();

  5.         lock.lockAsync(10, TimeUnit.SECONDS);

  6.         Future<Boolean> res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS);

  7.         if(res.get()){

  8.         // do your business

  9.         }

  10.     } catch (InterruptedException e) {

  11.         e.printStackTrace();

  12.     } catch (ExecutionException e) {

  13.         e.printStackTrace();

  14.     } finally {

  15.         lock.unlock();

  16.     }

  17. }


2. 公平鎖(Fair Lock)
Redisson分佈式可重入公平鎖也是實現了java.util.concurrent.locks.Lock接口的一種RLock對象。在提供了自動過期解鎖功能的同時,保證了當多個Redisson客戶端線程同時請求加鎖時,優先分配給先發出請求的線程。


 
  1. public void testFairLock(RedissonClient redisson){

  2.     RLock fairLock = redisson.getFairLock("anyLock");

  3.     try{

  4.         // 最常見的使用方法

  5.         fairLock.lock();

  6.         // 支持過期解鎖功能, 10秒鐘以後自動解鎖,無需調用unlock方法手動解鎖

  7.         fairLock.lock(10, TimeUnit.SECONDS);

  8.         // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖

  9.         boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);

  10.     } catch (InterruptedException e) {

  11.         e.printStackTrace();

  12.     } finally {

  13.         fairLock.unlock();

  14.     }

  15. }


Redisson同時還爲分佈式可重入公平鎖提供了異步執行的相關方法:


 
  1. RLock fairLock = redisson.getFairLock("anyLock");

  2. fairLock.lockAsync();

  3. fairLock.lockAsync(10, TimeUnit.SECONDS);

  4. Future<Boolean> res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);


3. 聯鎖(MultiLock)
Redisson的RedissonMultiLock對象可以將多個RLock對象關聯爲一個聯鎖,每個RLock對象實例可以來自於不同的Redisson實例。


 
  1.  

    public void testMultiLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){
    
        RLock lock1 = redisson1.getLock("lock1");
    
        RLock lock2 = redisson2.getLock("lock2");
    
        RLock lock3 = redisson3.getLock("lock3");
    
        RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
    
        try {
    
            // 同時加鎖:lock1 lock2 lock3, 所有的鎖都上鎖成功纔算成功。
    
            lock.lock();
    
            // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
    
            boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
    
        } catch (InterruptedException e) {
    
            e.printStackTrace();
    
        } finally {
    
            lock.unlock();
    
        }
    
    }

     


4. 紅鎖(RedLock)
Redisson的RedissonRedLock對象實現了Redlock介紹的加鎖算法。該對象也可以用來將多個RLock對象關聯爲一個紅鎖,每個RLock對象實例可以來自於不同的Redisson實例。

  1.  

public void testRedLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){

    RLock lock1 = redisson1.getLock("lock1");

    RLock lock2 = redisson2.getLock("lock2");

    RLock lock3 = redisson3.getLock("lock3");

    RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);

    try {

        // 同時加鎖:lock1 lock2 lock3, 紅鎖在大部分節點上加鎖成功就算成功。

        lock.lock();

        // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖

        boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);

    } catch (InterruptedException e) {

        e.printStackTrace();

    } finally {

        lock.unlock();

    }

}


5. 讀寫鎖(ReadWriteLock)
Redisson的分佈式可重入讀寫鎖RReadWriteLock,Java對象實現了java.util.concurrent.locks.ReadWriteLock接口。同時還支持自動過期解鎖。該對象允許同時有多個讀取鎖,但是最多隻能有一個寫入鎖。


 
  1.  

    RReadWriteLock rwlock = redisson.getLock("anyRWLock");
    
    // 最常見的使用方法
    
    rwlock.readLock().lock();
    
    // 或
    
    rwlock.writeLock().lock();
    
    // 支持過期解鎖功能
    
    // 10秒鐘以後自動解鎖
    
    // 無需調用unlock方法手動解鎖
    
    rwlock.readLock().lock(10, TimeUnit.SECONDS);
    
    // 或
    
    rwlock.writeLock().lock(10, TimeUnit.SECONDS);
    
    // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
    
    boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
    
    // 或
    
    boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
    
    ...
    
    lock.unlock();

     


6. 信號量(Semaphore)
Redisson的分佈式信號量(Semaphore)Java對象RSemaphore採用了與java.util.concurrent.Semaphore相似的接口和用法。

RSemaphore semaphore = redisson.getSemaphore("semaphore");

semaphore.acquire();

//或

semaphore.acquireAsync();

semaphore.acquire(23);

semaphore.tryAcquire();

//或

semaphore.tryAcquireAsync();

semaphore.tryAcquire(23, TimeUnit.SECONDS);

//或

semaphore.tryAcquireAsync(23, TimeUnit.SECONDS);

semaphore.release(10);

semaphore.release();

//或

semaphore.releaseAsync();

7. 可過期性信號量(PermitExpirableSemaphore)
Redisson的可過期性信號量(PermitExpirableSemaphore)實在RSemaphore對象的基礎上,爲每個信號增加了一個過期時間。每個信號可以通過獨立的ID來辨識,釋放時只能通過提交這個ID才能釋放。
  1.  


8. 閉鎖(CountDownLatch)
Redisson的分佈式閉鎖(CountDownLatch)Java對象RCountDownLatch採用了與java.util.concurrent.CountDownLatch相似的接口和用法。

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");

latch.trySetCount(1);

latch.await();

// 在其他線程或其他JVM裏

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");

latch.countDown();

轉載:https://blog.csdn.net/l1028386804/article/details/73523810

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章