java锁的种类以及辨析(一):自旋锁

1、自旋锁

自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下

public class SpinLock {private AtomicReference<Thread> sign =new AtomicReference<>();public void lock(){Thread current = Thread.currentThread();while(!sign .compareAndSet(null, current)){}}public void unlock (){Thread current = Thread.currentThread();sign .compareAndSet(current, null);}
}

使用了CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。

当有第二个线程调用lock操作时由于owner值不为空,导致循环一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。

由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

注:该例子为非公平锁,获得锁的先后顺序,不会按照进入lock的先后顺序进行。

java锁的种类以及辨析(一):自旋锁相关推荐

  1. java锁的种类以及辨析(转载)

    java锁的种类以及辨析(一):自旋锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我 ...

  2. Java锁的种类以及辨析(四):可重入锁

    Java锁的种类以及辨析(四):可重入锁 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数 ...

  3. 辨析:自旋锁与信号量

    自旋锁(Spinlock) 信号量(Semaphore): 1. 自旋锁与信号量简介 自旋是锁的一种实现方式,通过忙等待("自旋,spinning")来实现[例如通过while循环 ...

  4. 一文看懂临界区、互斥锁、同步锁、临界区、信号量、自旋锁等名词!

    点击上方"业余草",选择"置顶公众号" 第一时间获取技术干货和业界资讯! 关于线程安全的专有名词有一大堆.你们突然之间问我这个名词是什么意思,那个名词是什么意思 ...

  5. 自旋锁和互斥锁实例_多线程编程之自旋锁

    一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用 ...

  6. Linux 锁机制(3)之自旋锁

    Linux 锁机制(3)之自旋锁 1. 自旋锁 1.1 两种锁 1.2 自旋锁 1.3 自旋名字来源:自旋锁一直循环等待,直到获取锁为止. 1.4 自旋锁优点: 2 自旋锁特点/使用: 2.1 临界区 ...

  7. 自旋锁与互斥锁的对比、手工实现自旋锁

    自旋锁与互斥锁的对比.手工实现自旋锁 版权声明:本文为博主原创文章,转载请注明出处,谢谢. https://blog.csdn.net/FreeeLinux/article/details/53695 ...

  8. Java锁的种类以及辨析(二):自旋锁的其他种类

    作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...

  9. java 自旋锁_java锁的种类以及辨析(一):自旋锁

    public class SpinLock { private volatile int lock = 0; private static Unsafe theUnsafe; private stat ...

最新文章

  1. 配置文件http://www.cnblogs.com/Jevon-ran/p/7112007.html
  2. apply,call,bind区别
  3. 将Windows8安装在手持终端上
  4. IPSec的NAT穿越
  5. 函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据
  6. 阿克斯java表_java 入门第三季的6-5 作业, 希望大家指点
  7. 版是什么_雕版研习 | 什么是版画?版是画的母亲,画是版的子女
  8. 6种快速统计代码执行时间的方法,真香!(史上最全)
  9. 如何将QVTKWidget嵌入到QT窗体,实现点云的显示?
  10. 锁屏面试题百日百刷-VUE篇(一)
  11. Hadoop HIVE 窗口函数
  12. Go (interface)接口二
  13. 2010年篮球规则(FIBA)
  14. android阿拉伯语言的数字
  15. LayerCAM:Exploring Hierarchical Class Activation Maps for Localization
  16. ios 凭据验证_iOS内购IAP(十四) —— IAP的收据验证(一)
  17. java模拟键盘输入中文_Appium+java 模拟键盘输入
  18. 计算机中1 tb的硬盘容量大小等于,大脑记忆容量等于多大硬盘?
  19. Golang位运算符
  20. 测序技术回顾与第三代测序技术展望

热门文章

  1. 树莓派3B+ 引脚图说明
  2. 番茄助手 Visual Assist X 下载安装及使用
  3. AD软件生成gerb文件方法参考
  4. 设置line-height无效的解决办法
  5. 用 Mindjet MindManager 管理自己的思维
  6. 游戏中动态设置文字描边颜色
  7. 网络安全学习第6篇 - 爆破及PE文件解释
  8. 【Linux】 常用命令
  9. ETHEREUM PET SHOP
  10. “找不到或加载主类”是什么意思?