自旋锁原理及java自旋锁
首先是一种锁,与互斥锁相似,基本作用是用于线程(进程)之间的同步。与普通锁不同的是,一个线程A在获得普通锁后,如果再有线程B试图获取锁,那么这个线程B将会挂起(阻塞);试想下,如果两个线程资源竞争不是特别激烈,而处理器阻塞一个线程引起的线程上下文的切换的代价高于等待资源的代价的时候(锁的已保持者保持锁时间比较短),那么线程B可以不放弃CPU时间片,而是在“原地”忙等,直到锁的持有者释放了该锁,这就是自旋锁的原理,可见自旋锁是一种非阻塞锁。
二、自旋锁可能引起的问题:
1.过多占据CPU时间:如果锁的当前持有者长时间不释放该锁,那么等待者将长时间的占据cpu时间片,导致CPU资源的浪费,因此可以设定一个时间,当锁持有者超过这个时间不释放锁时,等待者会放弃CPU时间片阻塞;
2.死锁问题:试想一下,有一个线程连续两次试图获得自旋锁(比如在递归程序中),第一次这个线程获得了该锁,当第二次试图加锁的时候,检测到锁已被占用(其实是被自己占用),那么这时,线程会一直等待自己释放该锁,而不能继续执行,这样就引起了死锁。因此递归程序使用自旋锁应该遵循以下原则:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。
三、JAVA中一种自旋锁的实现:
<span style="font-size:14px;">import java.util.concurrent.atomic.AtomicReference;
class SpinLock {//java中原子(CAS)操作AtomicReference<Thread> owner = new AtomicReference<Thread>();//持有自旋锁的线程对象private int count;public void lock() {Thread cur = Thread.currentThread();//lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。当有第二个线程调用lock操作时由于owner值不为空,导致循环 //一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。while (!owner.compareAndSet(null, cur)){}}public void unLock() {Thread cur = Thread.currentThread();owner.compareAndSet(cur, null);}}
}
public class Test implements Runnable {static int sum;private SpinLock lock;public Test(SpinLock lock) {this.lock = lock;}public static void main(String[] args) throws InterruptedException {SpinLock lock = new SpinLock();for (int i = 0; i < 100; i++) {Test test = new Test(lock);Thread t = new Thread(test);t.start();}Thread.currentThread().sleep(1000);System.out.println(sum);}@Overridepublic void run() {this.lock.lock();sum++;this.lock.unLock();}
}</span>
四、java CAS
CAS是一种系统原语,是Compare And Set的缩写。
转载于:https://www.cnblogs.com/sunp823/p/5601408.html
自旋锁原理及java自旋锁相关推荐
- java锁的概念,Java ReentrantLock锁机制概念篇
分享Java锁机制实现原理,细节涉及volatile修饰符.CAS原子操作.park阻塞线程与unpark唤醒.双向链表.锁的公平性与非公平性.独占锁和共享锁.线程等待await.线程中断interr ...
- MySQL——数据库锁原理
摘要 数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.例如,操作缓冲池中的LRU列表,删除.添加.移动LRU列表中的元素,为了保证一致 ...
- Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)
概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...
- java让线程空转_Java锁:悲观/乐观/阻塞/自旋/公平锁/闭锁,锁消除CAS及synchronized的三种锁级别...
JAVA LOCK 大全 [TOC] 一.广义分类:乐观锁/悲观锁 1.1 乐观锁的实现CAS (Compare and Swap) 乐观锁适合低并发的情况,在高并发的情况下由于自旋,性能甚至可能悲观 ...
- 自旋锁和互斥锁的区别 java中lock Syntronized区别
转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...
- java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)
Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...
- 自旋锁原理及其应用场景
题外话 自旋锁不是一种锁(类型),自旋锁是线程没有获取到锁时的一种等待策略. 自旋锁的提出背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要 ...
- Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除
文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...
最新文章
- c语言 图的存储邻接矩阵,数据结构之---C语言实现图的数组(邻接矩阵)存储表示...
- spring19:AspectJ的初步介绍
- 【JAVASCRIPT】无刷新评论
- mysql select 使用_mysql select简单用法
- selenium 解析网页_用Selenium进行网页搜刮
- Linux的简介与虚拟机的管理
- Lua 学习笔记(四)语句与控制结构
- Android 系统(257)---Launcher显示未读通知的数量
- App Store最新审核指南(2015年3月更新版)
- TS笔记--------Jonathan
- 不登录mysql 执行sql_不登录到MySQL执行SQL语句
- 转 node.js和 android中java加密解密一致性问题;
- 计算机课堂有趣的游戏,有趣的课堂游戏作文范文5篇
- 访问samba服务器提示无权限使用网络资源
- 【微信公众号】怎么办理信息系统安全等级保护备案证明?
- 来到传统行业做程序员,从准备提桶跑路到引领技术风潮?背景
- MyBatis xml动态sql insert批量插入 报错Operand should contain 1 column(s)
- 思科意欲收购 Banzai Cloud,此举将成为思科在云原生领域的第二笔重要收购
- Tomcat服务端口8080被占用解决方法
- 【数据影像】加载历史影像(Esri Living Atlas)和谷歌影像
热门文章
- 31个实用find命令的案例
- Activiti(Flowable)流程克隆(运行时实例克隆)解决方案 一种订单制造中分裂与合并的核心技术实践...
- Intel 处理器 ME 管理引擎是无法移除的安全隐患
- Linux系统Bash(Shell)基础知识(4)
- Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
- 搭建VSFTPD服务器 虚拟用户认证方式
- [Material Design] 打造简单朴实的CheckBox
- 怎么确认mysql正确安装_怎么确认mysql是否安装好了
- [2018.10.11 T3] 欠钱
- Ajax学习笔记-运行原理及实现-2