java 自旋锁实现
时间: 2023-09-12 09:05:05 浏览: 211
### 回答1:
Java 中可以使用 `java.util.concurrent.atomic` 包中的 `AtomicInteger` 类来实现自旋锁。例如:
```
AtomicInteger lock = new AtomicInteger(1);
void acquireLock() {
while (!lock.compareAndSet(1, 0)) {
// busy wait
}
}
void releaseLock() {
lock.set(1);
}
```
这里的自旋锁使用了 Java 的原子变量来实现,通过调用 `compareAndSet` 方法来获取锁,当锁可用时,该方法会将锁的值从 1 更改为 0,并返回 true,否则返回 false。在释放锁时,只需要将锁的值设置为 1 即可。
### 回答2:
自旋锁是一种线程同步的机制,常用于多线程环境下保护临界区。它可以避免线程的频繁切换,提高程序的执行效率。
Java中自旋锁的实现通常使用了volatile关键字和CAS(Compare And Swap)机制。下面是一种简单的自旋锁实现示例:
```java
public class SpinLock {
private volatile boolean locked = false;
public void lock() {
// 使用CAS操作尝试将locked变量从false修改为true
while (!compareAndSet(false, true)) {
// locked为true时,说明锁已经被其他线程获取,当前线程进入自旋等待
Thread.yield();
}
}
public void unlock() {
// 释放锁,将locked变量设为false
locked = false;
}
private boolean compareAndSet(boolean expect, boolean update) {
// 使用CAS操作设置locked变量的值
return Unsafe.getUnsafe().compareAndSwapBoolean(this, lockedOffset, expect, update);
}
}
```
这里的locked变量使用volatile修饰,保证了线程间的可见性。lock()方法中,使用CAS操作尝试将locked变量从false修改为true,如果成功表示获取了锁,否则进入自旋等待。在unlock()方法中,将locked变量设为false,释放锁。
需要注意的是,自旋锁适用于临界区的执行时间很短的情况,如果临界区执行时间较长,存在大量的自旋等待,会浪费CPU资源,此时应该使用其他的同步机制,如互斥锁。
阅读全文