Java锁之自旋锁

自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁
这样的优点:是减少线程上下文切换的消耗,
缺点是循环会消耗CPU

原来提到的比较并交换,底层使用的就是自旋,自旋就是多次尝试,多次访问,不会阻塞的状态就是自旋。

优缺点

优点:循环比较获取直到成功为止,没有类似于wait的阻塞

缺点:当不断自旋的线程越来越多的时候,会因为执行while循环不断的消耗CPU资源

手写自旋锁

通过CAS操作完成自旋锁,A线程先进来调用myLock方法自己持有锁5秒,B随后进来发现当前有线程持有锁,不是null,所以只能通过自旋等待,直到A释放锁后B随后抢到


/*** 手写一个自旋锁** 循环比较获取直到成功为止,没有类似于wait的阻塞** 通过CAS操作完成自旋锁,A线程先进来调用myLock方法自己持有锁5秒,B随后进来发现当前有线程持有锁,不是null,所以只能通过自旋等待,直到A释放锁后B随后抢到*/
public class SpinLockDemo {// 现在的泛型装的是Thread,原子引用线程AtomicReference<Thread>  atomicReference = new AtomicReference<>();public void myLock() {// 获取当前进来的线程Thread thread = Thread.currentThread();System.out.println(Thread.currentThread().getName() + "\t come in ");// 开始自旋,期望值是null,更新值是当前线程,如果是null,则更新为当前线程,否者自旋while(!atomicReference.compareAndSet(null, thread)) {}}/*** 解锁*/public void myUnLock() {// 获取当前进来的线程Thread thread = Thread.currentThread();// 自己用完了后,把atomicReference变成nullatomicReference.compareAndSet(thread, null);System.out.println(Thread.currentThread().getName() + "\t invoked myUnlock()");}public static void main(String[] args) {SpinLockDemo spinLockDemo = new SpinLockDemo();// 启动t1线程,开始操作new Thread(() -> {// 开始占有锁spinLockDemo.myLock();try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}// 开始释放锁spinLockDemo.myUnLock();}, "t1").start();// 让main线程暂停1秒,使得t1线程,先执行try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}// 1秒后,启动t2线程,开始占用这个锁new Thread(() -> {// 开始占有锁spinLockDemo.myLock();// 开始释放锁spinLockDemo.myUnLock();}, "t2").start();}
}

最后输出结果

t1    come in
.....五秒后.....
t1   invoked myUnlock()
t2   come in
t2   invoked myUnlock()

首先输出的是 t1 come in

然后1秒后,t2线程启动,发现锁被t1占有,所有不断的执行 compareAndSet方法,来进行比较,直到t1释放锁后,也就是5秒后,t2成功获取到锁,然后释放

Java面试之锁-自旋锁相关推荐

  1. 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】

    第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...

  2. 常⻅锁策略(1. 乐观锁 悲观锁2. 公平锁 非公平锁3. 读写锁4. 可重入锁 自旋锁)

    目录 1. 乐观锁 & 悲观锁 1.1乐观锁定义 1.2 乐观锁实现 -- CAS 1.3 悲观锁定义和应⽤ 2. 公平锁 & 非公平锁 3. 读写锁 3.1 读写锁 3.2 独占锁 ...

  3. POSIX互斥锁自旋锁

    基础组件-POSIX互斥锁自旋锁 基础组件 基础组件-POSIX互斥锁自旋锁 前言 一.互斥锁 二.自旋锁 特点: 场景: 使用原则 自旋锁属性 三.两把锁的区别 1. 调度策略 2.使用场景 四.常 ...

  4. Java 面试之线程与锁

    原文:https://blog.csdn.net/u012102104/article/details/79772952 进程.线程   进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元 ...

  5. java重入锁 自旋锁_java 自旋锁(可重入且无死锁)

    java自旋锁 的实现原理:如果自旋锁被另外一个线程对象持有,那么当前获取锁的线程将陷入while循环等待,直到那个持有自旋锁的线程对象释放它所持有的自旋锁,那么那些想要获取该自旋锁的线程对象 将会有 ...

  6. JAVA面试要点010---重入锁_ReentrantLock 详解

    JAVA技术交流QQ群:170933152 https://www.cnblogs.com/-new/p/7256297.html 这个地方的文章还不错 ReentrantLocak特性(对比sync ...

  7. java锁 -- 自旋锁

    1.概念 自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU. 之前文章提到的比较并交换,底层使用 ...

  8. java多线程- 互斥锁 自旋锁

    如果一个资源会被不同的线程访问修改,那么我们把这个资源叫做临界资源(<操作系统>),那么对于该资源访问修改相关的代码就叫做临界区.引入互斥锁即解决多个线程之间共享同一个共享资源,这是多线程 ...

  9. Java面试突击:公平锁和非公平锁有什么区别?

    从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁.但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看. 正文公平锁:每个线程获取锁的顺 ...

最新文章

  1. Windows下Wireshark安装版本选择方式
  2. java 登录踢出_spring security 4 如何踢出用户?
  3. Java好文统计( 引用 )
  4. 信息学奥赛一本通(1323:【例6.5】活动选择)
  5. java 僵尸进程_Linux 僵尸进程
  6. SpringBoot四大核心之自动装配——源码解析
  7. ibatis insert mysql_iBATIS创建操作
  8. matlab fft 功率谱,matlab实现功率谱估计,关于FFT点数选取到底什么标准?
  9. 类库、通用变量、is和as、委托
  10. 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
  11. 给列表项标记添加自定义图像
  12. 什么是网络,网络类型,网络结构
  13. 怎么做PPT 课件代做 驼峰设计
  14. 关键词作用和选择技巧
  15. Anaconda 踩过的一些坑
  16. 20120912新工作感想
  17. P1359 租用游艇 (线性dp
  18. 微信小程序 iOS tableview
  19. 1到100的偶数之和是多少_求1到100之间所有偶数之和
  20. 数据挖掘技术具有哪些特点?

热门文章

  1. 2.2 获取图像感兴趣区域_基于Hu距的图像旋转矫正之OpenCV实现
  2. 单进程程序怎样在linux运行,linux下C程序:运行单个实例
  3. java程序员从笨鸟到菜鸟之_Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)...
  4. 工厂员工晋升机制_维修厂如何设置员工晋升机制?
  5. java 虚拟机类加载 及内存结构
  6. Zend Framework学习之Zend_Config
  7. 编程珠玑---第二章 啊哈!算法
  8. Android布局控件之LinearLayout详解
  9. python中lambda()的用法_python中lambda()的用法
  10. python数据可视化代码_Python实现简单的数据可视化