| | | |
| 是一种 保护临界资源的同步机制。它确保在任何时刻只有一个线程能持有锁并访共享资源,其他线程必须等待。 | 基于CPU的compare and swap(CAS)原子操作来实现加锁和解锁的,保证操作的原子性和高效性 | 读锁:共享并发,当无写锁时,多个线程可以同时持有读锁,大幅提升读操作吞吐量写锁:互斥独占,一旦被持有,其他所有读写操作都必须等待,保证数据一致性 |
| | 获取失败时,“忙等待”。自旋锁会让线程在循环中持续尝试获取锁,直到成功为止 | |
| | | |
| 适合锁持有时间较长的场景(如IO操作、复杂计算),避免CPU空转浪费资源,适合持有时间较长但竞争并不是很激烈的场景 | 适用于高频持有锁,但是持有时间极短的场景。自旋锁是一种“空间换时间”的策略,它非常适合多核处理器环境下,且临界区代码执行极快(锁竞争时间极端)的场景 | 读多写少,完美适配缓存系统、配置中心等读操作远多于写操作的场景。根据业务场景权衡 ,读多写少读优先,写多读少写优先,要求严格公平选公平锁。 |
| 竞争失败时由内核调度挂起线程,自动释放CPU资源避免忙等 | | 写优先锁:保证写线程优先获取锁,确保数据更新的及时性。公平锁:严格按照请求到达的先后顺序获取锁,避免线程“饿死” |
| 在高并发场景下,频繁的挂起和唤醒会导致系统性能显著下降 | 忙等待会持续占有CPU资源,造成浪费。若持有时间过长,则严重影响系统整体吞吐量 | 读优先锁:极端情况下,可能会因为写线程长时间无法获取锁而“饿死”写优先锁:可能会因为读线程长时间无法获取锁而“饿死” |