这是后端面试集锦第十六篇博文——java
锁面试话术❗❗❗
1. 介绍一下乐观锁和悲观锁
乐观锁的话就是比较乐观,每次去拿数据的时候,认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制
或者CAS
算法实现。
乐观锁在读操作比较多的场景比较适用,这样可以提高吞吐量,就像数据库提供的write_condition
机制,其实都是乐观锁。
悲观锁的话就是每次去拿数据的时候,也认为别人会修改数据,这个时候就会加上锁,这就导致其他线程想拿数据的话,就会阻塞,直到这个线程修改完成才会释放锁,让其他线程获取数据。
在数据库里的行级锁、表级锁都是在操作之前就先锁住数据再操作数据 ,都属于悲观锁。
Java
中的synchronized
和ReentrantLock
等独占锁就是悲观锁思想的实现。
·Java·中各种锁其实都是悲观锁的实现,在操作数据的时候,数据都会被当前线程锁住。
2. 介绍一下公平锁和非公平锁
-
公平锁: