自旋锁的 概念及示例代码
时间: 2024-05-04 19:15:55 浏览: 109
自旋锁是一种用于保护共享资源不被多个线程同时访问的锁。当一个线程需要访问共享资源时,它会尝试获取自旋锁,如果锁已经被其他线程占用,则该线程会在一个循环中一直尝试获取锁,直到锁被释放为止。自旋锁的优点是在锁被占用的时间很短的情况下,能够减少线程的上下文切换,从而提高系统的性能。
以下是一个基于C++11的自旋锁的示例代码:
```
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print(int num) {
mtx.lock();
std::cout << "["<< num << "]" << std::endl;
mtx.unlock();
}
int main () {
std::thread t1(print, 1), t2(print, 2);
t1.join();
t2.join();
return 0;
}
```
在上面的示例代码中,我们使用了C++11标准的mutex库来创建了一个互斥锁,通过mtx.lock()和mtx.unlock()来获取和释放锁,在print函数中保证了对共享资源std::cout的独占访问。虽然这个代码中没有使用自旋锁,但是这里的std::mutex在一些实现中是使用自旋锁来实现的。
相关问题
java自旋锁的 概念及示例代码
Java自旋锁是一种等待锁的方式,在多线程并发情况下可以避免线程频繁地切换。当一个线程请求锁的时候,如果该锁被其他线程占用,则该线程不会立即被阻塞,而是假装一直占有着CPU在等待锁的释放,这个过程就称为自旋。自旋的好处在于减少线程切换的开销,使得被阻塞的线程能更快地获取到锁。
下面是一个简单的Java自旋锁示例代码:
```
import java.util.concurrent.atomic.AtomicReference;
public class SpinLock {
private AtomicReference<Thread> owner = new AtomicReference<>();
public void lock() {
Thread currentThread = Thread.currentThread();
//自旋获取锁
while (!owner.compareAndSet(null, currentThread)) {
}
}
public void unlock() {
Thread currentThread = Thread.currentThread();
owner.compareAndSet(currentThread, null);
}
}
```
在上面的代码中,自旋锁的核心是AtomicReference类,它可以保证在并发情况下的原子性操作。当一个线程需要获取锁时,通过compareAndSet方法来CAS操作,如果返回值为true表示成功获取锁,否则就一直自旋等待锁的释放。当线程释放锁时,再次通过compareAndSet方法来释放锁。
阅读全文