乐观锁和悲观锁
2018-06-18 01:17:05来源:未知 阅读 ()
1、数据库方面:
悲观锁就是for update
乐观锁就是 version字段
2、JDK方面:
悲观锁就是sync
乐观锁就是原子类(内部使用CAS机制实现)
悲观锁
认为总会有人抢我的。
乐观锁
认为基本没人抢,认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。
CAS(Compare and swap)
比较和替换是设计并发算法时用到的一种技术,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
ABA问题(来自知乎)
小明在提款机,提取了50元,因为提款机问题,
有两个线程,同时把余额从100变为50
线程1(提款机):获取当前值100,期望更新为50,
线程2(提款机):获取当前值100,期望更新为50,
线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50
线程3(默认):获取当前值50,期望更新为100,
这时候线程3成功执行,余额变为100,
线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!
此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50),这就是ABA问题带来的成功提交。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 拼多多三面惨败,问题在于java中间件、数据库与spring框架. 2020-06-04
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文 2020-05-31
- Docker容器启动时初始化Mysql数据库 2020-05-27
- Mybatis显示修改数据库成功,数据库却没有修改 2020-05-22
- Java面试常被问到这道题:如何保证缓存与数据库的双写一致性 2020-05-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash