1.概念

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

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

2.源码解释(AtomicInteger 类)

3.自旋锁的好处

循环比较直到成功为止,没有类似wait的阻塞

4.自旋锁代码验证:

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(1);} catch (InterruptedException e) {e.printStackTrace();}// 1秒后,启动t2线程,开始占用这个锁new Thread(() -> {// 开始占有锁spinLockDemo.myLock();// 开始释放锁spinLockDemo.myUnLock();}, "t2").start();}
}

5.代码输出结果

打印输出结果:
t1 come in
(--一秒后---)
t2 come in
(--五秒后---)
t1 invoked myUnlock()
t2 invoked myUnlock()

java锁 -- 自旋锁相关推荐

  1. Java面试之锁-自旋锁

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

  2. java适应性自旋锁_深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?...

    自旋锁 & 非自旋锁 什么是自旋?字面意思是 "自我旋转" .在 Java 中也就是循环的意思,比如 for 循环,while 循环等等.那自旋锁顾名思义就是「线程循环地去 ...

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

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

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

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

  5. POSIX互斥锁自旋锁

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

  6. java 实现自旋锁_java自旋锁的代码实现

    自旋锁:spinlock 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环好用CPU 代码: import java.util.concur ...

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

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

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

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

  9. 从 class 文件 看 synchronize 锁膨胀过程(偏向锁 轻量级锁 自旋锁 重量级锁)

    大家好,我是烤鸭: 前几天看马士兵老师的并发的课,里边讲到了 synchronize 锁的膨胀过程,今天想用代码演示一下. 1.  简单介绍 关于synchronize jdk 1.5 以后的优化,由 ...

最新文章

  1. 在C++中对字符串std::string使用switch/case语句
  2. 皮一皮:为啥年轻人不生孩子?
  3. 0074 几道面试题
  4. 【CodeForces - 1062C】Banh-mi (贪心,数学,找规律,快速幂)
  5. c++调用Libsvm
  6. xshell堡垒机_Jumpserver开源堡垒机管理
  7. 太空飞行计划 网络流
  8. 数据产品-数据分析和可视化工具Excel函数使用
  9. 【输入一个年份,判断是否为闰年(leap year)】
  10. Appium+Robotframework实现Android应用的自动化测试-3:一个必不可少的工具介绍
  11. 嵌入式基础面八股文——死锁与饥饿(4)
  12. Java面向对象--instanceof关键字
  13. HeadFirst jsp 08 无脚本JSP
  14. vs2005 编码转换后编译的时候会出错,”error c101008a“,处理方法
  15. 第五章 PCB 设计规则设置及 PCB 绘制
  16. C语言笔记 · ASCII码表
  17. 我的拆机经历——戴尔灵越5570系列
  18. 苏炳添博士论文研究自己,奥运学术两兼顾,还是暨大副教授,网友:真正的Run数据...
  19. Multi-Exemplar Affinity Propagation
  20. 国内优秀的免费素材网站大比拼

热门文章

  1. 温莎计算机应用硕士是针对国际学生的吗,专业推荐 | 加拿大留学,温莎大学英语计算机专业了解一下...
  2. 【深度学习】基于人脸关键点的视频心率检测
  3. 18.2 增强型图元文件
  4. 计算机网络波动大,网络不稳定怎么办,小编教你电脑网络不稳定怎么办
  5. jetson nano 部署yolov5s
  6. zuiqingchun4
  7. 【Wi-Fi】IEEE 802.11 Standards 之 802.11a/b/g/n/ac/ax初探
  8. python用谷歌内核制作浏览器_用cef Python打造自己的浏览器
  9. 【Lua 入门基础篇(七)】表模块与包
  10. uni-app web-view跳转自定义html