什么是乐观锁和悲观锁?如何实现
时间: 2023-12-18 22:59:33 浏览: 37
乐观锁是一种总是假设最好情况的锁,每次获取数据时都认为别人不会修改,所以不会上锁。在更新数据时,乐观锁会判断在此期间是否有其他人更新了该数据,通常使用版本号机制和CAS算法来实现。乐观锁适用于多读的应用场景,可以提高系统的吞吐量。Java中的java.util.concurrent.atomic包下的原子变量类就是使用乐观锁的一种实现方式,它使用了CAS(Compare and Swap)算法。
悲观锁是一种总是假设最坏情况的锁,每次获取数据时都认为别人会修改,所以每次都会上锁。当其他线程想获取该数据时,会被阻塞直到该线程释放锁(共享资源每次只给一个线程使用)。传统的关系型数据库中常使用悲观锁,如行锁、表锁、读锁、写锁等,在操作之前先上锁。Java中的synchronized关键字和ReentrantLock等独占锁就是悲观锁的实现方式。
乐观锁通过假设最好情况来提高系统的吞吐量,适用于多读的场景;而悲观锁通过假设最坏情况来保证数据的一致性,适用于多写的场景。乐观锁的实现可以使用版本号机制和CAS算法,而悲观锁的实现可以使用锁机制,如行锁、表锁、读锁、写锁等。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [什么是乐观锁和悲观锁](https://blog.csdn.net/weixin_48016395/article/details/124068012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)