悲观锁详解(定义种类及使用场景)

悲观锁详解(定义种类及使用场景)-mikechen

悲观锁经常在Java面试被问到,比如:悲观锁有哪些?悲观锁的使用场景等,下面我就来详解悲观锁@mikechen

什么是悲观锁

悲观锁详解(定义种类及使用场景)-mikechen

悲观锁是一种并发控制机制,它的基本思想是在访问共享资源之前先将其锁定,以防止其他事务对其进行修改。

 

悲观锁的作用

悲观锁通常用于保护关键数据或资源,悲观锁是一种保护共享资源的并发控制机制。

例如:银行账户余额、库存数量等,当一个事务需要修改这些数据时,它会先获取锁,执行完操作后再释放锁,以保证数据的一致性。

在多线程环境下,多个线程同时对同一数据进行访问时,悲观锁可以保证同一时刻只有一个线程可以访问该数据,避免了数据的不一致性。

 

悲观锁有哪些

Java中实现悲观锁的方式有以下几种:

1.synchronized关键字

synchronized是Java中最基本的悲观锁实现方式。它可以将代码块或方法锁定,同一时刻只能有一个线程进入锁定区域,其他线程需要等待锁的释放才能执行。

2.ReentrantLock

ReentrantLock是Java中的可重入锁,可以重复获得锁。它提供了比synchronized更灵活的锁定机制,支持多个条件变量,可以实现更精细的线程协作。

3.ReadWriteLock

ReadWriteLock是Java中读写锁的实现,用于读写分离场景。它允许多个线程同时读取数据,但只允许一个线程写入数据,写入时其他线程需要等待。

 

MySQL常见的悲观锁包括

1.行级锁

对数据库中某个记录进行锁定,只有持有锁的事务才能访问该记录,常见的行级锁包括排它锁和共享锁。

2.表级锁

对数据库中某个表进行锁定,只有持有锁的事务才能访问该表,常见的表级锁包括共享锁和排它锁。

 

悲观锁使用场景

悲观锁主要用于多线程环境下保护共享资源的一致性,适用于以下场景:

1.数据库并发控制

在数据库中,悲观锁可以用于控制对共享数据的并发访问。例如,可以使用行级锁或表级锁来保护数据的一致性。

2.多线程环境下的数据更新

当多个线程同时对同一数据进行修改时,需要使用悲观锁来避免数据的不一致性。

3.实现线程安全的缓存

当多个线程同时访问一个缓存时,需要使用悲观锁来保护缓存的一致性。例如,在Java中可以使用ConcurrentHashMap来实现线程安全的缓存。

以上就是悲观锁的详解,如果还对乐观锁感兴趣,请查看:乐观锁和悲观锁详解(面试必问必考)

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法