java中如何实现可重入的自旋锁

说明

1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。

2、优点:减少上下文切换的消耗。

缺点:循环消耗CPU。

实例

publicclassReentrantSpinLock{


privateAtomicReference<Thread>owner=newAtomicReference<>();

//可重入次数
privateintcount=0;

//加锁
publicvoidlock(){
Threadcurrent=Thread.currentThread();
if(owner.get()==current){
count++;
return;
}
while(!owner.compareAndSet(null,current)){
System.out.println("--我在自旋--");
}
}

//解锁
publicvoidunLock(){
Threadcurrent=Thread.currentThread();
//只有持有锁的线程才能解锁
if(owner.get()==current){
if(count>0){
count--;
}else{
//此处无需CAS操作,因为没有竞争,因为只有线程持有者才能解锁
owner.set(null);
}
}
}

publicstaticvoidmain(String[]args){
ReentrantSpinLockspinLock=newReentrantSpinLock();
Runnablerunnable=()->{
System.out.println(Thread.currentThread().getName()+"开始尝试获取自旋锁");
spinLock.lock();
try{
System.out.println(Thread.currentThread().getName()+"获取到了自旋锁");
Thread.sleep(4000);
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
spinLock.unLock();
System.out.println(Thread.currentThread().getName()+"释放了了自旋锁");
}
};
Threadthread1=newThread(runnable);
Threadthread2=newThread(runnable);
thread1.start();
thread2.start();
}
}

以上就是java中实现可重入自旋锁的方法,希望对大家有所帮助。更多Java学习指路:Java基础

原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容