CAS和锁的相关面试题
CAS 锁
锁的四种状态和升级
锁的四种状态:无锁、偏向锁、轻量级锁和重量级锁
无锁
无锁就是没有真正意义上的上锁,所有的线程还是能访问并修改同一个资源,但是通过算法控制,实现同时只有一个线程修改成功。CAS原理及应用即是无锁的实现。无锁无法全面代替有锁,但无锁在某些场合下的性能是非常高的。
比如:
CAS全称 Compare and Swap(比较与交换),是一种无锁算法。
在不使用锁的情况下(没有线程被阻塞),实现多线程的变量同步。
CAS算法主要涉及到3个操作数:
①需要进行读写操作的值 V
②判断是否更新的比较值 A
③需要替换值V写入新的值 B
在最开始将V赋值给A,再进行数据操作生成B,需要更新V之前,
比较一下A是否还与V相等,相等说明数据未变化,执行更新操作,
不相等,则更新不能完成。
CAS全称 Compare and Swap(比较与交换),是一种无锁算法。
在不使用锁的情况下(没有线程被阻塞),实现多线程的变量同步。
CAS算法主要涉及到3个操作数:
①需要进行读写操作的值 V
②判断是否更新的比较值 A
③需要替换值V写入新的值 B
在最开始将V赋值给A,再进行数据操作生成B,需要更新V之前,
比较一下A是否还与V相等,相等说明数据未变化,执行更新操作,
不相等,则更新不能完成。
偏向锁
偏向锁是指一段同步代码一直只被一个线程所访问,那么该线程会自动获取锁,降低获取锁的成本。
> 例如:家里只有一个碗,但也只有我一个人需要一个碗吃饭,所以不存在争抢,这就是偏向锁
因为在大多数情况下,锁总都是被同一个线程多次反复获得,不存在多线程竞争,所以就出现了偏向锁。目标就是在只有一个线程执行同步代码块时能够提高性能。
偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动释放偏向锁。
> 例如:我家还是只有一个碗,当我朋友来我家和我一起吃饭,这时候就有两个人,只有这一个碗吃饭,偏向锁升级
偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态。撤销偏向锁后恢复到轻量级锁(标志位为“00”)的状态。 **当进入偏向锁的时候 先进行线程id判断,如果是同一个线程,那不会进行锁的升级,如果线程的id不同那么会 进行线程的竞争,这时候会进行锁升级;**
轻量级锁
是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。
如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位设置为“00”,表示此对象处于轻量级锁定状态。
如果轻量级锁的更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明多个线程竞争锁。
若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。
重量级锁
> 当我和女朋友都很饿的时候,我女朋友觉得我吃的太慢了,不想等我吃完,这时候就会去争抢这唯一的一个碗先吃饭,这是重量级锁状态
升级为重量级锁时,锁标志的状态值变为“10”,此时Mark Word中存储的是指向重量级锁的指针,此时等待锁的线程都会进入阻塞状态。
这里只有如果深入了解 会涉及到 用户态(轻量级问题)和内核态(重量级问题、操作系统)的问题!!!
## 总结
> 整体的锁状态升级流程是:无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁
锁状态的改变是根据竞争激烈程度进行的,在几乎无竞争的条件下,会使用偏向锁,在轻度竞争的条件下,会由偏向锁升级为轻量级锁, 在重度竞争的情况下,会升级到重量级锁。
偏向锁通过对比Mark Word 解决加锁问题,避免执行CAS操作。
轻量级锁是通过CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒带来的性能影响。
重量级锁是将除拥有锁的线程之外的线程全部阻塞。
那cas是什么? cas中会遇见哪些问题 如何解决?
cas即比较并替换,是一种实现并发算法时常用到的技术
里面有三个操作数:内存值V、旧的预期值A、要修改的值B;
当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不做并返回false。
CAS存在ABA问题,解决方案是:可以对每个值添加一个版本号来判断,CAS只是一种思想
使用CAS+版本号进行解决,对一个数据如果修改了的话,那么版本号就进行+1,然后再循环比较的时候,不仅仅比较值再根据版本号就可以解决ABA问题。
如果版本号相同我们就可以加入时间戳 当版本号和时间戳都相同时 才会进行数据的改变!
CAS和锁的相关面试题的更多相关文章
- 转: 关于CAS cpu锁的技术说明。
写的不错.原文链接如下: https://blog.csdn.net/dviewer/article/details/51943140 部分摘要: 2016年07月18日 16:30:08 阅读数:3 ...
- java锁机制的面试题
java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...
- 【Java并发编程】synchronized相关面试题总结
目录 说说自己对于synchronized关键字的了解 synchronized关键字的三种使用 synchronized关键字的底层原理 JDK1.6之后对synchronized关键字进行的优化 ...
- CAS无锁算法与ConcurrentLinkedQueue
CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ...
- HashMap 相关面试题及其解答
Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>[] ...
- C# 相关面试试题简单的总结
最近一个搞NET开发的朋友离职了,想让我给他找点关于NET的相关面试题,准备抱一下佛脚,迎接新的挑战. 我赶紧找到以前检索的各种宝典,试题,今天梳理一下关于NET的基础知识点. 1.面向对象语言的三大 ...
- java并发:AtomicInteger 以及CAS无锁算法【转载】
1 AtomicInteger解析 众所周知,在多线程并发的情况下,对于成员变量,可能是线程不安全的: 一个很简单的例子,假设我存在两个线程,让一个整数自增1000次,那么最终的值应该是1000:但是 ...
- Linux相关面试题&答案
Linux相关面试题&答案 Linux面试题&答案 假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] " ...
- CAS无锁机制原理
原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ...
随机推荐
- nginx location proxy_pass 后面的url 加与不加/的区别
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 首先是l ...
- manual for emacs markdown-mode(English)
markdown-mode now requires Emacs 24.3 or later. Markup insertion and replacement keybindings under C ...
- Hyper-V设置固定IP
win+x以管理员启动PowerShell 创建虚拟交换机,等同于在Hyper-V管理器界面中新建虚拟网络交换机 New-VMSwitch -SwitchName "NAT-VM" ...
- Python os.openpty() 方法
概述 os.openpty() 方法用于打开一个新的伪终端对.返回 pty 和 tty的文件描述符.高佣联盟 www.cgewang.com 语法 openpty()方法语法格式如下: os.open ...
- PHP pow() 函数
实例 pow() 的实例: <?phpecho(pow(2,4) . "<br>");echo(pow(-2,4) . "<br>" ...
- 区块链钱包开发 - USDT - 二、创建交易错误以及解决方法
这里总结了开发中一些常见报错和解决方案 1. 提示:createRawtx_change "Amount is not a number" 解决:参数中 tx 的 amout 需要 ...
- js跳转界面
js页面跳转大全 所谓的js页面跳转就是利用javesrcipt对打开的页面ULR进行跳转,如我们打开的是A页面,通过javsrcipt脚本就会跳转到B页面.目前很多垃圾站经常用js跳转将正常页面跳转 ...
- 深入探究JVM之方法调用及Lambda表达式实现原理
@ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...
- WebLogic 省略项目名称
希望 WebLogic 部署的项目,不需要输入项目名,直接通过IP端口访问. 在 WEB-INF 目录下添加文件 weblogic.xml <?xml version="1.0&quo ...
- 使用cors完成跨域请求处理
跨域的含义 同源策略以及其限制内容 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CSFR等攻击.所谓同源是指"协议+域名+端口&quo ...