锁知识点
死锁产生的原因及解决方法
死锁产生的原因:
1,系统资源的竞争
2,进程推进顺序非法
3,信号量使用不当也会造成死锁
4,死锁产生的必要条件:(1.互斥条件,2.不剥夺条件,3.请求和保持条件,4.循环等待条件)
如何避免死锁
-
加锁顺序(线程按照一定的顺序加锁)
-
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
-
死锁检测
解决已经产生的死锁
一个可行的做法是释放所有锁,回退,并且等待一段随机的时间后重试
一个更好的方案是给这些线程设置 优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁。
悲观锁 乐观锁的区别
-
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。适用于多写的场景
-
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁。适用于多读的场景
两种实现方式:
-
版本号机制: 即在数据库中增加版本机制字段, 每次数据被修改+1,当在读数据的时候会获取比版本机制该字段是否相等, 相等则更新, 反之重试更新操作, 直到成功为止
-
CAS算法: 即比较与交换,是种无锁算法, 就是在不使用锁的情况下实现多线程之间的变量同步, 也叫非阻塞同步(NIO)
后期持续更新