基於ReentrantLock鎖解決超賣問題

2021-10-19 08:31:25 字數 2703 閱讀 9133

@service

@slf4j

public

class

orderservice

//商品當前庫存

integer currentcount = product.

getcount()

; system.out.

println

(thread.

currentthread()

.getname()

+"庫存數:"

+currentcount)

;//校驗庫存

if(purchaseproductnum > currentcount)

// 增量更新庫存

updateproductcount

(purchaseproductnum,

"***"

,new

date()

,product.

getid()

);platformtransactionmanager.

commit

(transaction1);}

finally

transactionstatus transaction = platformtransactionmanager.

gettransaction

(transactiondefinition)

; order order =

neworder()

; order.

setorderamount

(product.

getprice()

.multiply

(new

bigdecimal

(purchaseproductnum)))

; order.

setorderstatus(1

);//待處理

order.

setreceivername

("***");

order.

setreceivermobile

("13311112222");

order.

setcreatetime

(new

date()

);order.

setcreateuser

("***");

order.

setupdatetime

(new

date()

);order.

setupdateuser

("***");

insertselective

(order)

; orderitem orderitem =

neworderitem()

; orderitem.

setorderid

(order.

getid()

);orderitem.

setproductid

(product.

getid()

);orderitem.

setpurchaseprice

(product.

getprice()

);orderitem.

setpurchasenum

(purchaseproductnum)

; orderitem.

setcreateuser

("***");

orderitem.

setcreatetime

(new

date()

);orderitem.

setupdatetime

(new

date()

);orderitem.

setupdateuser

("***");

insertselective

(orderitem)

;// 手動提交事務

platformtransactionmanager.

commit

(transaction)

;return order.

getid()

;}}

通過lock.lock();開啟重入鎖,在該鎖下面開啟事務,查詢庫存、校驗庫存以及增量更新庫存,在庫存為空或者庫存不足時,需要跑出異常,使得事務可以回滾,最後提交事務。

在該鎖塊中需要使用try…finally…確保異常時,可以呼叫 lock.unlock();,使鎖能夠被釋放。

然後再下面寫訂單的操作也需要開啟乙個新的事務。

@runwith

(springrunner.

class

)@springboottest

public

class

catch

(exception e)

finally})

;}cdl.

await()

; es.

shutdown()

;}}

通過cyclicbarrier.await();使得五個執行緒等待,然後併發執行,最後都要呼叫cdl.countdown();

在**最後使用cdl.await();等待所有執行緒執行完畢,才將執行緒池關閉。

ReentrantLock 基於原始碼了解工作流程

reentrantlock和synchronized在jdk1.8版本後效能相差無幾,甚至synchronized小優,但是synchronized不支援中斷和超時,也就是說通過synchronized一旦被阻塞住,如果一直無法獲取到所資源就會一直被阻塞,即使中斷也沒用,這對併發系統的效能影響太大了...

ReentrantLock實現同步

reentrantlock 也可以實現synchronized方法 塊的同步效果。reentrantlock 實現同步 如下 1 新建乙個service類 public class myservice public static void methodb 2 新建乙個測試類 public class...

ReentrantLock之unlock方法分析

public void unlock public final boolean release int arg return false release 1 嘗試在當前鎖的鎖定計數 state 值上減1。成功返回true,否則返回false。當然在release 方法中不僅僅只是將state 1這麼...