import java.util.concurrent.atomic.AtomicInteger; public class SpinLock { private final AtomicInteger lockState = new AtomicInteger(0); public void lock() { int expectedValue; do { expectedValue = 0; // 锁未被占用时的预期值 } while (!lockState.compareAndSet(expectedValue, 1)); // 使用CAS尝试设置锁状态 } public void unlock() { lockState.set(0); // 释放锁 } }这段代码的(!lockState.compareAndSet(expectedValue怎么理解
时间: 2025-06-24 11:43:17 浏览: 11
### Java 中 `AtomicInteger` 的 `compareAndSet` 方法在自旋锁中的作用与逻辑
#### `compareAndSet` 方法简介
`compareAndSet` 是 Java 并发包中 `java.util.concurrent.atomic` 提供的一个核心方法,用于执行一种称为 CAS(Compare-And-Swap)的操作。它的功能是在原子级别比较对象的当前值是否等于预期值,若是则将其更新为目标值并返回 `true`;否则不做任何修改并返回 `false`[^1]。
---
#### 在自旋锁中的应用
在自旋锁的设计中,`compareAndSet` 扮演着至关重要的角色。以下是其具体工作方式:
1. **初始化阶段**
自旋锁通常会定义一个共享变量(如 `AtomicInteger` 或类似的原子类),用来表示锁的状态。初始状态下,这个变量会被设置为 0 表示锁未被占用。
2. **加锁过程**
当某个线程试图获取锁时,它会调用 `compareAndSet` 方法检查锁的状态是否仍然为空闲(即期望值为 0)。如果确实是空闲状态,则将锁标记为已占用(通常是将值改为 1),从而完成加锁动作。反之,若发现锁已经被其他线程占有,则进入一个循环继续尝试直到成功为止。
3. **解锁过程**
对应地,在释放锁的时候,只需简单地把该标志位重新设定回原始值即可(比如从 1 变成 0)。这一步同样可能涉及竞争条件处理以确保安全性。
---
#### 示例代码解析
下面给出一段典型的基于 `AtomicInteger` 实现的自旋锁代码及其逐行说明:
```java
import java.util.concurrent.atomic.AtomicInteger;
public class SpinLockDemo {
private final AtomicInteger lockState = new AtomicInteger(0);
// 加锁函数
public void lock() {
int expectedValue;
do { // 开始自旋
expectedValue = 0; // 预期锁处于未锁定状态
} while (!lockState.compareAndSet(expectedValue, 1)); // 使用CAS操作尝试获得锁
// 如果失败就再次迭代直至成功
}
// 解锁函数
public void unlock() {
lockState.set(0); // 直接将锁状态重置为未锁定
// (注意实际生产环境需考虑更多细节)
}
}
```
在这里:
- `lock()` 函数内部通过无限循环配合 `compareAndSet` 达到了持续试探的目的;
- 每次循环都会先假设目前没有任何别的线程持有锁 (`expectedValue=0`) ,然后借助 CAS 技术验证这一假定成立与否 —— 成立的话立即占据资源(`set to 1`) 结束整个流程;不成立试探依旧维持原状等待下次机会到来。
---
#### 关键点分析
- **原子性保障**: 因为每次判断与更改的动作都被压缩到单一不可分割指令之内,所以即使存在多个并发访问者也无法破坏数据一致性[^2]。
- **高效性体现**: 对于那些预计只会经历很短时间冲突区域的应用场合而言,相比传统阻塞型同步手段能够显著降低调度成本提升吞吐率[^3]。
---
#### 局限性和改进建议
虽然上述基础版已经展示了如何构建简单的自旋锁模型,但它也暴露出一些潜在缺陷,例如缺乏公平策略可能导致饥饿现象发生或者过度消耗CPU周期等问题。针对这些问题业界提出了多种改进方案像票号锁(Ticket Lock),CLH队列锁(CLH Queue Lock)以及MCS锁(Mellor-Crummey & Scott Algorithm)[^3]等等皆各有侧重解决不同方面需求。
---
阅读全文
相关推荐


















