说明
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
暂无评论内容