乐观锁是数据库解决并发问题最常用的手段之一,你知道一般会在什么情况下使用乐观锁吗?跟我来了解一下吧。
一、乐观锁概念
乐观锁,一般的说,它就是一个乐观的机制,顾名思义嘛。乐观锁这个家伙跟它的名字一样非常的乐观,它会在其他线程每次来拿数据时都乐观的认为它们非常识趣肯定不会修改自己的数据的,所以它就干脆不上锁了,但又放心不下,所以在更新的期间还是会判断一下这期间有没有不识趣的线程去修改这个数据。乐观锁的实现有如版本号等几种机制来实现。乐观锁适用于多读的应用类型,这样有助于提高吞吐量,如数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
悲观锁与乐观锁各有各的优点与缺点,不能够片面的认为一种好于另一种,如乐观锁这种适用于写操作较少的就适用于冲突真的极少发生时,这样可以极大节省锁的开销,加大整个系统吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
乐观锁肯定是相对悲观锁而言的。乐观锁非常乐观,所以它采取的加锁机制也会更为宽松。乐观锁一般而言不会刻意去使用数据库本身的锁机制,它会依赖数据本身来保证数据的正确性。
乐观锁乐观,所以它相信事务之间的数据竞争的概率是比较小的,因此它会尽可能的直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。
二、乐观锁一般使用场景
1.线程冲突不太严重,但还是有一点严重的情况,一般会使用乐观锁。因为如果要使用Synchronized同步锁进行线程阻塞和唤醒切换以及用户内核态间的切换操作会额外浪费消耗许多cpu资源,反之因为CA是基于硬件实现的,不用进入线程内核,不需要切换线程,操作自旋几率较少,所以可以获得更高的性能。
2、乐观锁因为只有在数据修改的时候才会判断一下这个期间有没有线程去更新这个数据,如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
以上就是关于乐观锁使用场景的一些整理了,想了解更多java相关java常见问答知识就快关注我们的网站吧。
推荐阅读: