Lock - 对锁的一些面试题的总结
看到一个问题:请谈谈你对乐观锁、悲观锁、自旋锁、分段所、读写锁、排它锁、共享锁等等锁的理解,他们有什么区别?这么大致一看,发现没什么思路,觉得对锁的了解还是不够透彻。这边来总结一下,但不会很细致。
乐观锁 - 悲观锁
乐观锁和悲观锁是相对而言的,他们的区别如下表格:
锁 | 概述 | 使用场景 | 样例 |
---|---|---|---|
悲观锁 | 悲观锁对数据被外界修改持保守态度(悲观),因此在整个数据处理过程中,将数据出于锁定状态,而别的任务出于被阻塞的状态; | 写多读少,保证写操作时的数据安全 | 1、JVM中的synchronized和Lock;2、分布式环境基于数据库行锁、页锁、表锁、共享锁(读锁)、排它锁(写锁);3、基于zookeeper、Redis 的分布式锁 |
乐观锁 | 乐观锁认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的重提与否进行检测,如果发现冲突了,程序自动去重试(实现通常用“版本号”) | 读多写少,提高系统吞吐 | 1、JDK并发包中的原子类;2、数据库乐观锁、缓存乐观锁 |
自旋锁
自旋锁是互斥锁的一种实现。在自旋锁中,当资源被枷锁后,其他线程想要获取资源,此时该