1.乐观锁
乐观锁回滚重试(cas问题) compare and swap compare and set
如果修改过则重新读取,再次尝试更新,循环上述步骤直到更新成功(允许更新失败多少次后放弃)
2.悲观锁
悲观锁阻塞事务
每次去拿数据都会认为别人会修改,每次拿数据都会上锁,别人想拿数据就会被挡住,知道悲观锁被释放
synchronized 偏向锁-轻量级锁-重量级锁
偏向锁 偏向于第一个获得它的线程,不会主动释放,执行过程中不会重复加锁,性能较高
轻量级锁 开始锁竞争,没有抢到锁的会自旋,不停循环比较是否能够获得释放状态的锁(忙等 busy-waiting)
重量级锁 自旋超过十次,会升级重量级锁 线程会挂起,等待将来被唤醒
3.公平锁(先申请的先得到)
ReentrantLock(默认非公平,可以设置fair true 公平锁)
读写锁
可中断锁(unkock)
非公平锁 (后申请的可能先获取到锁)
synchronized
不可中断锁
非公平锁的吞吐量比公平锁大,如果没有特殊要求,优先使用非公平锁
4.分布式锁
三种实现方式:数据库乐观锁 基于redis的分布式锁 基于zookeeper的分布式锁
满足条件:①互斥、在任意时刻,只有一个客户端能持有锁
②不会发生死锁,即使有一个客户端在持有锁崩溃没有放开锁,也能保证其他客户端加锁
③容错性,
④加锁解锁同一个客户端(同一个请求,解铃还须系铃人)
加锁就一行代码:jedis.set(String key, String value, String nxxx, String expx, int time)
第一个 key
第二个 value requestId 客户端uuid
第三个 nx SET IF NOT EXIST key 不存在set 存在不做操作
第四个 expx px key加一个过期的设置
第五个为time key的过期时间
浙公网安备 33010602011771号