悲观锁和乐观锁
Posted ~千里之行,始于足下~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了悲观锁和乐观锁相关的知识,希望对你有一定的参考价值。
悲观锁:
某个线程访问临界区修改数据的时候,悲观的认为其他线程也会并行修改,所以在线程修改之前加锁互斥访问
悲观锁包括互斥锁,读写锁,自旋锁
互斥锁和自旋锁的区别:
- 自旋锁加锁时,加不到锁,线程不会切换(时间片未到的情况下),会持续的尝试拿锁,直到拿到的情况下
- 互斥锁加锁时,加不到锁,线程会发生切换(时间片未到的情况下),进入睡眠,当占有互斥锁的线程释放锁时,申请锁的线程被唤醒来加锁
自旋锁的优点和缺点:
- 自旋锁的效率远高于互斥锁,自旋锁加不到锁时,不会线程切换
- 自旋锁加不到锁时,一直占用cpu尝试加锁,如果不能短时间内获得锁,会使cpu效率降低
- 适用于临界区代码较短时
乐观锁:
某个线程访问临界区修改数据时,乐观的认为只有本线程会修改数据,所以不加锁.在修改之前要判段数据有没有被修改过,若修改了,本线程不能再修改数据;若没有修改,则修改数据,适用于读多写少的场景
使用到的技术:
版本号控制和CAS(compare and swap)无锁编程
版本号控制:检查版本号,判断版本号有没有发生变化,若没有发生变化,修改产生新的版本
CAS
- V:内存地址
- A:旧的预期值
- B:将内存地址值修改程新值
在修改之前,先判断V和A是否相等,若相等,则可以修改;不相等,则重新获取V的值,重新进行判断
缺点:会产生ABA的问题,获取A值后,其他发生了修改但最终没有改变A的值(即+1,-1)
我们可以将版本号和CAS配合起来解决
以上是关于悲观锁和乐观锁的主要内容,如果未能解决你的问题,请参考以下文章