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.自旋锁和互斥锁
一般情况下,当线程获得不了锁,那么他会进入睡眠状态,这就是互斥锁。
而自旋锁是当获得不了锁的时候,会一直循环直到获得为止。
网友评论