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和锁的相关面试题的更多相关文章

  1. 转: 关于CAS cpu锁的技术说明。

    写的不错.原文链接如下: https://blog.csdn.net/dviewer/article/details/51943140 部分摘要: 2016年07月18日 16:30:08 阅读数:3 ...

  2. java锁机制的面试题

    java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...

  3. 【Java并发编程】synchronized相关面试题总结

    目录 说说自己对于synchronized关键字的了解 synchronized关键字的三种使用 synchronized关键字的底层原理 JDK1.6之后对synchronized关键字进行的优化 ...

  4. CAS无锁算法与ConcurrentLinkedQueue

    CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ...

  5. HashMap 相关面试题及其解答

    Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>[] ...

  6. C# 相关面试试题简单的总结

    最近一个搞NET开发的朋友离职了,想让我给他找点关于NET的相关面试题,准备抱一下佛脚,迎接新的挑战. 我赶紧找到以前检索的各种宝典,试题,今天梳理一下关于NET的基础知识点. 1.面向对象语言的三大 ...

  7. java并发:AtomicInteger 以及CAS无锁算法【转载】

    1 AtomicInteger解析 众所周知,在多线程并发的情况下,对于成员变量,可能是线程不安全的: 一个很简单的例子,假设我存在两个线程,让一个整数自增1000次,那么最终的值应该是1000:但是 ...

  8. Linux相关面试题&答案

    Linux相关面试题&答案 Linux面试题&答案 假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] " ...

  9. CAS无锁机制原理

    原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ...

随机推荐

  1. IO流——转换流、缓冲流

    一.转换流 1. OutputStreamWriter类 属于字符输出流,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节. 它的作 ...

  2. Hexo博客美化之蝴蝶(butterfly)主题魔改

      Hexo是轻量级的极客博客,因为它简便,轻巧,扩展性强,搭建部署方便深受广大人们的喜爱.各种琳琅满路的Hexo主题也是被各种大佬开发出来,十分钦佩,向大佬仰望,大声称赞:流批!!! 我在翻看各种主 ...

  3. 1_Java语言概述

    学于尚硅谷开源课程 宋红康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...

  4. maven 一些高级用法命令

    发布本地jar到私服 命令 mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=D:\Downloads\OJDBC-Full\ojdbc6.ja ...

  5. list 和 [ ] 的功能不相同

    对于一个对象: list(对象) 可以进行强制转换 [对象] 不能够进行强制转换,只是在外围加上 [ ] 列表推导式中相同   2020-05-06

  6. Developer 转型记:一个开发平台的“魔力”

    摘要:开发者该如何借助AI技术,探索可沉淀的落地应用?在这AI技术浪潮下,实现完美的应用创新?我们一起来听听他的故事…… 随着政策的加持.技术快速的迭代,人工智能热潮正在蔓延.2020年,AI落地大考 ...

  7. 如何使用k3OS和Argo进行自动化边缘部署?

    本文转自边缘计算k3s社区 前 言 随着Kubernetes生态系统的发展,新的技术正在被开发出来,以实现更广泛的应用和用例.边缘计算的发展推动了对其中一些技术的需求,以实现将Kubernetes部署 ...

  8. PHP fileinode() 函数

    定义和用法 fileinode() 函数返回指定文件的 inode 编号. 如果成功,该函数返回指定文件的 inode 编号.如果失败,则返回 FALSE. 语法 fileinode(filename ...

  9. 6.15 省选模拟赛 老魔杖 博弈论 SG函数

    这道题确实没有一个很好的解决办法 唯一的正解可能就是打表找规律 或者 直接猜结论了吧. 尽管如此 在此也给最终结论一个完整的证明. 对于70分 容易发现状态数量不大 可以进行暴力dp求SG函数. 原本 ...

  10. Python编程基础(一)编程语言是什么?编译型语言和解释型语言的区别|Python是什么?

    编程语言是什么? 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(An ...