JAVA全系列 教程
3762个小节阅读:7089.1k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
ReentrantLock基于AQS,在并发编程中可以实现公平锁和非公平锁来对资源进行同步,同时,和synchronized一样,ReentrantLock支持可重入,ReentrantLock在调度上更灵活,支持更多丰富的功能。
温馨提示:
ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能。
第一只兔子还没喝完水又来一只兔子。
第一只兔子喝水喝的有点慢,之后来了两只兔子,都被小狗安排进了队列。
xxxxxxxxxx
@Override
public void updateOrderStatus(Map<String, Object> bodyMap) throws GeneralSecurityException {
log.info("******************* 修改订单状态 *********");
// 1. 获取明文
String plainText = WxVerifierUtils.decrypt(bodyMap, wxPayConfig.getApiV3Key());
// 2. 字符串转为map
HashMap plainTextMap = JSON.parseObject(plainText, HashMap.class);
// 3. 获取订单编号
String orderNo = (String) plainTextMap.get("out_trade_no");
/*在对业务数据进行状态检查和处理之前,
要采用数据锁进行并发控制,
以避免函数重入造成的数据混乱*/
//尝试获取锁:
// 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放
if (lock.tryLock()){
try {
// 5. 根据订单编号获取订单信息
OrderInfo orderInfo = iOrderInfoService.findByOrderNo(orderNo);
// 6. 判定订单状态
if (!OrderStatus.NOTPAY.getType().equals(orderInfo.getOrderStatus())){
return ;
}
// 7. 更新订单状态
iOrderInfoService.updateOrderStatus(orderInfo.getId(),OrderStatus.SUCCESS);
// 8. 添加交易记录
iPaymentInfoService.createPaymentInfo(plainTextMap);
}finally {
//要主动释放锁
lock.unlock();
}
}
}
实时效果反馈
1.ReentrantLock基于__实现独占锁。
A AQS
B CAS
C APT
D 以上都是错误
2.下列描述ReentrantLock和Synchronized区别正确的是__。
A 采用synchronized不需要用户去手动释放
B ReentrantLock必须要用户去手动释放锁
C synchronized不可中断,除非抛出异常
D 以上都是正确
答案
1=>A 2=>D