参考答案:
悲观锁和乐观锁是两种常见的锁策略,用于在并发编程中处理多线程对共享资源的访问。它们的主要区别在于对资源访问冲突的假设和应对方式不同。
悲观锁的核心思想是:认为在多线程并发环境中,资源竞争是频繁的,因此每次访问共享资源时都需要加锁,避免冲突。如果线程在访问资源时发现资源被其他线程占用,它会一直等待,直到获得锁。
synchronized
或 ReentrantLock
。synchronized
(Java)和 ReentrantLock
(Java)都可以实现悲观锁。乐观锁的核心思想是:认为资源竞争不频繁,因此在访问共享资源时,不加锁,而是在操作结束时检查是否有其他线程修改了资源。如果没有冲突,则操作成功;如果有冲突,则重试或回滚操作。
CAS(Compare-And-Swap)
是一种乐观锁的实现方式。SELECT ... FOR UPDATE
来查询数据,并检查是否有并发冲突。特性 | 悲观锁 | 乐观锁 |
---|---|---|
锁定方式 | 每次访问时加锁 | 访问时不加锁,操作后检查 |
锁的粒度 | 较大(可能是整个数据或资源) | 较小(通常是数据版本或时间戳) |
适用场景 | 数据冲突较多,竞争激烈 | 数据冲突较少,竞争较轻 |
性能 | 高并发时可能导致性能瓶颈 | 高并发时性能更好,避免了加锁 |
典型实现 | synchronized ,ReentrantLock | CAS ,版本号控制 |
最近更新时间:2024-12-09