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