java怎么实现可重入的自旋锁
作者:SunnyJourney
时间:2023-04-28
来源:正软商城
浏览:4
说明1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。2、优点:减少上下文切换的消耗。缺点:循环消耗CPU。实例publicclassReentrantSpinLock{privateAtomicReferenceowner=newAtomicReference();//可重入次数privateintcount=0;//加锁publicvoidlock(){Threadcurrent=Thread.currentThread();if(owner.get()==current){count++;ret
本文目录
说明
1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。
2、优点:减少上下文切换的消耗。
缺点:循环消耗CPU。
实例
public class ReentrantSpinLock {
private AtomicReference owner = new AtomicReference<>();
// 可重入次数
private int count = 0;
// 加锁
public void lock() {
Thread current = Thread.currentThread();
if (owner.get() == current) {
count++;
return;
}
while (!owner.compareAndSet(null, current)) {
System.out.println("--我在自旋--");
}
}
//解锁
public void unLock() {
Thread current = Thread.currentThread();
//只有持有锁的线程才能解锁
if (owner.get() == current) {
if (count > 0) {
count--;
} else {
//此处无需CAS操作,因为没有竞争,因为只有线程持有者才能解锁
owner.set(null);
}
}
}
public static void main(String[] args) {
ReentrantSpinLock spinLock = new ReentrantSpinLock();
Runnable runnable = () -> {
System.out.println(Thread.currentThread().getName() + "开始尝试获取自旋锁");
spinLock.lock();
try {
System.out.println(Thread.currentThread().getName() + "获取到了自旋锁");
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
spinLock.unLock();
System.out.println(Thread.currentThread().getName() + "释放了了自旋锁");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
}
}
作者最新文章
xshell如何使用密钥连接服务器
2026-11-05 21:38
动漫共和国资源入口及正版地址分享
2026-11-04 12:05
xshell端口ssh SSH隧道建立方法
2026-11-03 10:11
CorelDRAW是免费软件吗?详解试用、订阅与一次性购买收费模式
2026-10-30 19:32
PDF怎么免费转成Word并保留内容?转换前后检查要点
2026-10-30 17:50
下一篇:
iPadOS 16 的安装指南
热门文章
更多
精品专题
更多
Mac软件
更多
火山引擎 网页版
Windows/ macOS/ Linux
火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。
















