理解各种锁

2018-10-04  本文已影响0人  越过_1b61

1.首先是CAS(Compare-and-swap)

平台相关,它有三个操作数内存位置值V,旧值A,新值B。

CAS执行时,它检验如果值为A则用B更新V的值。多线程环境下有可能会产生ABA问题。

2.其次是乐观锁

乐观锁简而言之是在中字段上增加一个版本号,用来判断数据是否更新。

如:一个银行账户有$100,一开始的版本号为1.A从中取了$50,那么乐观锁机制会使当前版本为2,并且扣除$50,在A的操作过程中B来了,他要取$20,它读取版本号为1,当操作完了之后发现版本号为2,那么B的操作不执行。

3.最后是悲观锁

悲观锁一般是在数据库层加锁实现,应为如果在本系统下实现了悲观锁,那么不能保证外部系统的操作不会修改值。

一个典型的依赖数据库实现的悲观锁的例子:

select * from account where name="Erica" for update。在事务提交之前外部无法修改name='Erica'的值。

Hibernate的悲观锁也是这样实现的:String hqlStr = "from TUser as user where user.name='Erica'";

Query query = session.createQuery(hqlStr);

query.setLockMode("user",LockMode.UPGRADE); // 加锁

List userList = query.list();// 执行查询,获取数据

4.自旋锁和互斥锁

一般情况下,当线程获得不了锁,那么他会进入睡眠状态,这就是互斥锁。

而自旋锁是当获得不了锁的时候,会一直循环直到获得为止。

上一篇 下一篇

猜你喜欢

热点阅读