怎么在java中实现一个可重入的自旋锁

  介绍

怎么在java中实现一个可重入的自旋锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

java可以用来干什么

java主要应用于:1。网页开发;2。Android开发;3。客户端开发;4。网页开发;5。企业级应用开发;6。Java大数据开发;7。游戏开发等。

<强> 1,说明

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

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

缺点:循环消耗CPU。

<强> 2,实例

 public  class  ReentrantSpinLock  {
  ,
  ,
  ,,,private  AtomicReference, owner =, new  AtomicReference<在();
  ,
  ,,,//,可重入次数
  ,,,private  int  count =, 0;
  ,
  ,,,//,加锁
  ,,,public  void 锁(),{
  ,,,,,,,Thread  current =, Thread.currentThread ();
  ,,,,,,,if  (owner.get(),==,当前),{
  ,,,,,,,,,,,计数+ +;
  ,,,,,,,,,,,返回;
  ,,,,,,,}
  ,,,,,,,while  (! owner.compareAndSet (null,当前)),{
  ,,,,,,,,,,,System.out.println(“——我在自旋——“);
  ,,,,,,,}
  ,,,}
  ,
  ,,,//解锁
  ,,,public  void 解锁(),{
  ,,,,,,,Thread  current =, Thread.currentThread ();
  ,,,,,,,//只有持有锁的线程才能解锁
  ,,,,,,,if  (owner.get(),==,当前),{
  ,,,,,,,,,,,if  (count 祝辞,0),{
  ,,,,,,,,,,,,,,,计数,
  ,,,,,,,,,,,},{else 
  ,,,,,,,,,,,,,,,//此处无需CAS操作,因为没有竞争,因为只有线程持有者才能解锁
  ,,,,,,,,,,,,,,,owner.set(空);
  ,,,,,,,,,,,}
  ,,,,,,,}
  ,,,}
  ,
  ,,,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  thread2 =, new 线程(可运行);
  ,,,,,,,thread1.start ();
  ,,,,,,,thread2.start ();
  ,,,}
  }

看完上述内容,你们掌握怎么在java中实现一个可重入的自旋锁的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

怎么在java中实现一个可重入的自旋锁