Loading... ## 自旋锁spinlock 重点:尝试获取锁的线程不会立即阻塞,而是采用**循环的方式去尝试获取锁**,这样的好处是减少线程上下文切换的消耗,不会堵塞。缺点是循环会消耗CPU ```java public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; } ``` 推荐阅读 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/453.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://imgcdn.xn2001.com/usr/themes/handsome/assets/img/sj/6.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Java面试之CAS</p> <div class="inster-summary text-muted"> CAS是什么?CAS 全称Compare-And-Swap,它是一条CPU并发原语功能:判断内存某个位置的L值是否... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> ## 手敲自旋锁: 代码: ```java package com.juc.lock; import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; /** * Created by 乐心湖 on 2020/5/5 19:49 */ public class SpinLockDemo { /** * 原子引用线程 */ AtomicReference<Thread> atomicReference = new AtomicReference<>(); /** * 自己写一个锁 */ public void myLock() { Thread thread = Thread.currentThread(); System.out.println(thread.getName() + "\t come in !" + new Date()); // 交换不成功则一直自旋 while (!atomicReference.compareAndSet(null, thread)) { } } /** * 解锁 */ public void myUnLock() { Thread thread = Thread.currentThread(); atomicReference.compareAndSet(thread, null); System.out.println(thread.getName() + "\t go out !" + new Date()); } public static void main(String[] args) { SpinLockDemo spinLockDemo = new SpinLockDemo(); new Thread(() -> { spinLockDemo.myLock(); try { // 线程1在6秒后才释放锁 TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } spinLockDemo.myUnLock(); }, "Thread1").start(); // 等两秒才开始线程2 try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() -> { spinLockDemo.myLock(); spinLockDemo.myUnLock(); }, "Thread2").start(); } } ``` ```java Thread1 come in !Tue May 05 20:02:54 CST 2020 Thread2 come in !Tue May 05 20:02:56 CST 2020 Thread1 go out !Tue May 05 20:03:00 CST 2020 Thread2 go out !Tue May 05 20:03:00 CST 2020 ``` 从结果可以看出,在线程1还没有释放锁时,线程2无法执行操作,仅仅是进入后不断循环直到线程1释放锁。 这就是自旋锁的妙处。<hr class="content-copyright" style="margin-top:50px" /><blockquote class="content-copyright" style="font-style:normal"><p class="content-copyright">版权属于:乐心湖's Blog</p><p class="content-copyright">本文链接:<a class="content-copyright" href="https://www.xn2001.com/archives/457.html">https://www.xn2001.com/archives/457.html</a></p><p class="content-copyright">声明:博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" target="_blank" rel="nofollow noopener noopener" one-link-mark="yes">CC BY-SA 4.0 协议</a> ,转载请注明出处!</p></blockquote> 腾讯云社区邀请各位技术博主加入,福利多多噢! Last modification:August 18th, 2020 at 02:43 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat
2 comments
看到Java就头疼,大佬们都是如何学习的啊。我学Java巨吃力
这个,我感觉Java用起来比前端轻松得多,::quyin:amazing:: 应该是各有喜好无需强求。