Java面试之锁-自旋锁
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面试之锁-自旋锁相关推荐
- 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...
- 常⻅锁策略(1. 乐观锁 悲观锁2. 公平锁 非公平锁3. 读写锁4. 可重入锁 自旋锁)
目录 1. 乐观锁 & 悲观锁 1.1乐观锁定义 1.2 乐观锁实现 -- CAS 1.3 悲观锁定义和应⽤ 2. 公平锁 & 非公平锁 3. 读写锁 3.1 读写锁 3.2 独占锁 ...
- POSIX互斥锁自旋锁
基础组件-POSIX互斥锁自旋锁 基础组件 基础组件-POSIX互斥锁自旋锁 前言 一.互斥锁 二.自旋锁 特点: 场景: 使用原则 自旋锁属性 三.两把锁的区别 1. 调度策略 2.使用场景 四.常 ...
- Java 面试之线程与锁
原文:https://blog.csdn.net/u012102104/article/details/79772952 进程.线程 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元 ...
- java重入锁 自旋锁_java 自旋锁(可重入且无死锁)
java自旋锁 的实现原理:如果自旋锁被另外一个线程对象持有,那么当前获取锁的线程将陷入while循环等待,直到那个持有自旋锁的线程对象释放它所持有的自旋锁,那么那些想要获取该自旋锁的线程对象 将会有 ...
- JAVA面试要点010---重入锁_ReentrantLock 详解
JAVA技术交流QQ群:170933152 https://www.cnblogs.com/-new/p/7256297.html 这个地方的文章还不错 ReentrantLocak特性(对比sync ...
- java锁 -- 自旋锁
1.概念 自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU. 之前文章提到的比较并交换,底层使用 ...
- java多线程- 互斥锁 自旋锁
如果一个资源会被不同的线程访问修改,那么我们把这个资源叫做临界资源(<操作系统>),那么对于该资源访问修改相关的代码就叫做临界区.引入互斥锁即解决多个线程之间共享同一个共享资源,这是多线程 ...
- Java面试突击:公平锁和非公平锁有什么区别?
从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁.但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看. 正文公平锁:每个线程获取锁的顺 ...
最新文章
- Windows下Wireshark安装版本选择方式
- java 登录踢出_spring security 4 如何踢出用户?
- Java好文统计( 引用 )
- 信息学奥赛一本通(1323:【例6.5】活动选择)
- java 僵尸进程_Linux 僵尸进程
- SpringBoot四大核心之自动装配——源码解析
- ibatis insert mysql_iBATIS创建操作
- matlab fft 功率谱,matlab实现功率谱估计,关于FFT点数选取到底什么标准?
- 类库、通用变量、is和as、委托
- 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
- 给列表项标记添加自定义图像
- 什么是网络,网络类型,网络结构
- 怎么做PPT 课件代做 驼峰设计
- 关键词作用和选择技巧
- Anaconda 踩过的一些坑
- 20120912新工作感想
- P1359 租用游艇 (线性dp
- 微信小程序 iOS tableview
- 1到100的偶数之和是多少_求1到100之间所有偶数之和
- 数据挖掘技术具有哪些特点?
热门文章
- 2.2 获取图像感兴趣区域_基于Hu距的图像旋转矫正之OpenCV实现
- 单进程程序怎样在linux运行,linux下C程序:运行单个实例
- java程序员从笨鸟到菜鸟之_Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)...
- 工厂员工晋升机制_维修厂如何设置员工晋升机制?
- java 虚拟机类加载 及内存结构
- Zend Framework学习之Zend_Config
- 编程珠玑---第二章 啊哈!算法
- Android布局控件之LinearLayout详解
- python中lambda()的用法_python中lambda()的用法
- python数据可视化代码_Python实现简单的数据可视化