大家好,我是 V 哥。商城系統(tǒng)中,用戶在瀏覽商品詳情頁時可以查看庫存數(shù)量,這是讀操作,頻率較高。當用戶下單成功時,系統(tǒng)會更新庫存數(shù)量,這是寫操作,但相對較少。這是一個再常見不過的應(yīng)用場景了,在這種場景下,讀寫鎖分離設(shè)計模式就是最好的武器。
public class InventoryManagerTest {
public static void main(String[] args) {
InventoryManager inventoryManager = new InventoryManager();
// 初始化庫存
inventoryManager.updateStock("product_1", 100);
// 模擬多個線程同時讀取庫存
for (int i = 0; i < 5; i++) {
new Thread(() -> {
System.out.println("Stock for product_1: " + inventoryManager.checkStock("product_1"));
}).start();
}
// 模擬一個線程更新庫存
new Thread(() -> {
inventoryManager.updateStock("product_1", -10);
System.out.println("Stock after selling 10 units for product_1: " + inventoryManager.checkStock("product_1"));
}).start();
}
}
三、代碼分析
讀操作 (checkStock):
使用 readLock 加鎖,只需獲取讀鎖,不會影響其他讀取線程。
多個讀取線程可以同時進入 checkStock 方法,提升讀取并發(fā)性。
寫操作 (updateStock):
使用 writeLock 加鎖,寫操作會阻塞其他讀寫操作。
確保寫入操作是獨占的,防止并發(fā)寫操作導(dǎo)致的數(shù)據(jù)不一致問題。
四、運行結(jié)果示例
輸出可能如下(順序可能有所不同):
Stock for product_1: 100
Stock for product_1: 100
Stock for product_1: 100
Stock for product_1: 100
Stock for product_1: 100
Updated stock for product product_1: 90
Stock after selling 10 units for product_1: 90
更多建議: