介绍
怎么在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中实现一个可重入的自旋锁的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!