目錄
1. 普通可重入鎖(RLock)
2. 公平鎖(RFairLock)
3. 讀寫鎖(RReadWriteLock)
4. 多重鎖(RedissonMultiLock)
1. 普通可重入鎖(RLock)
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取鎖實例RLock lock = redisson.getLock("myLock");try {// 嘗試獲取鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放鎖if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("Lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
-
電商秒殺系統:多個用戶同時請求購買商品,通過分布式鎖確保同一時間只有一個用戶能夠成功下單。
-
分布式任務調度:多個節點同時運行任務,通過鎖確保任務的唯一性。
注釋說明
-
tryLock
方法:嘗試獲取鎖,可以指定等待時間和鎖的持有時間。 -
isHeldByCurrentThread
方法:檢查當前線程是否持有鎖,避免誤釋放。 -
unlock
方法:釋放鎖,確保在finally
塊中調用,防止資源泄漏。
2. 公平鎖(RFairLock)
示例代碼
import org.redisson.Redisson;
import org.redisson.api.RFairLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonFairLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取公平鎖實例RFairLock lock = redisson.getFairLock("myFairLock");try {// 嘗試獲取鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Fair lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire fair lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放鎖if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("Fair lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
-
資源分配系統:多個線程或節點請求資源,通過公平鎖確保按請求順序獲取資源。
-
隊列處理系統:多個消費者處理隊列中的任務,確保任務按順序處理。
注釋說明
-
公平鎖特點:按照請求順序獲取鎖,避免饑餓現象。
-
tryLock
方法:與普通鎖類似,但公平鎖會按照請求順序排隊。
3. 讀寫鎖(RReadWriteLock)
示例代碼
import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonReadWriteLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取讀寫鎖實例RReadWriteLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock");// 模擬讀操作Thread readThread = new Thread(() -> {try {readWriteLock.readLock().lock();System.out.println("Read lock acquired by " + Thread.currentThread().getName());// 模擬讀操作Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {readWriteLock.readLock().unlock();System.out.println("Read lock released by " + Thread.currentThread().getName());}});// 模擬寫操作Thread writeThread = new Thread(() -> {try {readWriteLock.writeLock().lock();System.out.println("Write lock acquired by " + Thread.currentThread().getName());// 模擬寫操作Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {readWriteLock.writeLock().unlock();System.out.println("Write lock released by " + Thread.currentThread().getName());}});// 啟動線程readThread.start();writeThread.start();try {readThread.join();writeThread.join();} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
-
緩存系統:多個線程讀取緩存,少數線程更新緩存,通過讀寫鎖提高并發性能。
-
數據庫查詢與更新:多個線程查詢數據庫,少數線程更新數據庫。
注釋說明
-
讀鎖共享:多個線程可以同時獲取讀鎖。
-
寫鎖獨占:寫鎖獲取后,其他線程無法獲取讀鎖或寫鎖。
-
鎖的釋放:確保在
finally
塊中釋放鎖,避免死鎖。
4. 多重鎖(RedissonMultiLock)
示例代碼
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.api.RedissonMultiLock;
import org.redisson.config.Config;public class RedissonMultiLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取多個鎖實例RLock lock1 = redisson.getLock("myLock1");RLock lock2 = redisson.getLock("myLock2");// 創建多重鎖RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);try {// 嘗試獲取多重鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = multiLock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Multi lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire multi lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放多重鎖if (multiLock.isHeldByCurrentThread()) {multiLock.unlock();System.out.println("Multi lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
-
分布式事務:多個資源需要同時鎖定,確保事務的原子性。
-
復雜業務流程:多個步驟需要分別鎖定不同資源,通過多重鎖確保整體