
说明
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基础
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















































暂无评论内容