🔎如何理解乐观锁和悲观锁的,具体怎么实现
🌸如何理解悲观锁与乐观锁
乐观锁🔒
预测接下来锁🔒冲突的概率不大
并不会真的加锁,只在数据进行提交修改的时候去对数据进行冲突检测
悲观锁🔒
预测接下来锁🔒冲突的概率较大
悲观锁总是假设最坏的情况,每次去拿数据时都认为别人会修改,所以每次拿数据时都进行加锁
🌸具体实现
乐观锁🔒
引入一个版本号,借助版本号识别当前的数据访问是否冲突
悲观锁🔒
先加锁,获取到锁再操作数据,获取不到锁就等待
🔎介绍读写锁
读写锁与互斥锁不同
读写锁可以
(1)给读加锁 (2)给写加锁 (3)解锁
其中
(1)读锁与读锁之间,不会产生锁竞争(不会影响程序速度)
(2)写锁与写锁之间,会产生锁竞争(会降低程序速度,但保证数据准确性)
(3)读锁与写锁之间,会产生锁竞争(会降低程序速度,但保证数据准确性)
主要应用于频繁读不频繁写的情况
🔎什么是自旋锁,为什么要使用自旋锁策略呢,缺点是什么
如果获取锁失败,就会一直重复加锁,不去做其他的事情(忙等),直到加锁成功
一旦锁被释放,可以第一时间拿到锁
一般为了能够更快的拿到锁,会选择自旋锁
优点
可以更快的拿到锁
缺点
会进行忙等(无法做其他的事情),浪费cpu
🔎synchronized 是可重入锁么
是
可重入锁
一个线程针对一把锁连续加锁两次后不会产生死锁
可重入锁会在第一次加锁时标记一下,记录当前线程是锁的拥有者
当第二次加锁时发现当前线程是锁的拥有者就会加锁成功
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油