@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這麼...