热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CAS的底层剖析

CAS1、什么是CAS?CAS:又叫campareandsetSwapExchange,自旋锁。再增加一个知识点:悲观锁:认为该操作会被别的线程打断;乐观锁:认为该操作不会被别的线

CAS

1、什么是CAS?

CAS:又叫 campare and set/Swap/Exchange,自旋锁。

再增加一个知识点:

悲观锁:认为该操作被别的线程打断;

乐观锁:认为该操作不会被别的线程打断,会消耗CPU资源;

注:悲观锁,各线程在队列里等待,不消耗CPU资源;而乐观锁时,各线程不断轮询,会消耗CPU资源。使用时理论上可通过压测来决定,但是一般情况下,都是直接使用Synchronized来解决数据同步问题,因为Synchronized经过这么长时间的改进,已经得到了很大的优化。

这里我举个例子来说明悲观锁和乐观锁:

顾名思义,悲观锁就很悲观,它总是认为别人会来抢锁;乐观锁就很乐观,总是认为别人不会来抢锁,很文明。

以上厕所为例:

悲观锁上厕所蹲坑,进去后由于害怕别人直接推门而进粗暴地和它抢马桶,于是便进门便插上门栓,以防止别人进来,然后厕所门上红灯亮起表示有人使用。而其他人想要上厕所时看到门上红灯亮起,故在外面排队等着,等里面的人出来以后,下一个再进去。

乐观锁上厕所蹲坑,进去后由于知道大家都很文明,不会粗暴地直接闯入,而是在推门之前会先敲门询问里面是否有人正在使用,所以进入厕所以后并不会锁门,而是直接开始噗噗噗,多好啊,省时间,哈哈哈。但是每一个来上厕所的人都是很急的,虽然大家都很文明,但是人有三急。所以,后来上厕所的人在外面会不断地敲门询问里面的使用者是否使用完毕。

ABA 问题的解决办法:加版本号。如,每改变一次,自身版本号就 加1。而是否对最后结果有影响(是否更新为新值)需要程序员自己判断。

如果程序员觉得没什么影响,只要结果还是A那就行,如果程序员觉得如果有改变,心里膈应,那就不行。

 


2、使用原子类的底层实现原理

以AtomicInteger 为例:

代码如下,为了实现线程安全,我们使用了原子类AtomicInteger ,而且变量增加使用了AtomicInteger 类的类方法 incrementAndGet()。

 接下来我们就对incrementAndGet() 一探究竟。

按住ctrl + 单击该方法,跳转到AtomicInteger.java类中:

 再点进去unsafe.getAndAddInt()方法,跳转到unsafe.class类中:

 这里有一个循环,条件是做一个CAS 操作。再点击进去,找到是当前类的一个native方法。

 这是什么意思呢?native表示这是用C/C++写的底层代码调用。

似乎到这里断了,不过为了一探究竟,我们继续找到了C代码。

在Java里是unsafe类的compareAndSwapInt(),在底层代码里对应的是unsafe.cpp文件中:

  我们观察到第1217行可知:最后调用的是Atomic::cmpxchg()方法,熟悉C/C++的话,就知道,这是stomic.cpp文件中的cmpxchg方法。

再点进去追击:

 可看到第56行是cmpxchg()方法,一路追踪,我们可发现,到最后是到了atomic_linux_x86.inline.cpp文件中。

找到Atomic.cpp文件中的cmpxchg()方法。

 在这里我们看:

在第95行有个LOCK_IF_MP() ,这其实是个宏定义,意思是是否是多核(Multi Processor):

再继续追击,最后,我们知道最终的实现是依靠底层的 lock cmpxchg  指令(CPU级别)。 

虽然我们从代码可知,在多核(CPU)时才加lock,单核(CPU)不加。如:6 核12线程,我们在这里视为12核。故,单核情况下,指的就是自己线程不会打断自己。

cmpxchg 并不是原子性的,保证原子性还是依靠前面的 Lock。所以,我们才说底层代码直接支持CAS,是一把悲观锁,可以是缓存锁,也可以是总线锁。

 

 

 

 

Over......



推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 本文目录一览:1、\mysybase.dump对数据库正常使用有影响吗 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • PeopleSoft安装镜像版本及导入语言包的方法
    本文介绍了PeopleSoft安装镜像的两个版本,分别是VirtualBox虚拟机版本和NativeOS版本,并详细说明了导入语言包的方法。对于Windows版本,可以通过psdmt.exe登录进入,并使用datamover脚本导入语言包。对于Linux版本,同样可以使用命令行方式执行datamover脚本导入语言包。导入语言包后,可以实现多种语言的登录。参考文献提供了相关链接以供深入了解。 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • xmake-ftmpxxx.luaxmake--filexxx.lua最简单:--添加名为demo的目标到工程target(demo)--设置目标程序类型为二进制,一般为 ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
author-avatar
凌波_薇步
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有