返回顶部
首页 > 资讯 > 精选 >CAS算法在JDK中怎么应用
  • 254
分享到

CAS算法在JDK中怎么应用

2023-06-02 16:06:13 254人浏览 独家记忆
摘要

今天小编给大家分享一下CAS算法在jdk中怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么是CAS?CAS:C

今天小编给大家分享一下CAS算法jdk中怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、什么是CAS?

CAS:Compare and Swap,即比较再交换。

jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。

2、CAS算法理解

对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS比较与交换的伪代码可以表示为:

do{          备份旧数据;         基于旧数据构造新数据;  }while(!CAS( 内存地址,备份的旧数据,新数据 ))
3、CAS开销

前面说过了,CAS(比较并交换)是CPU指令级的操作,只有一步原子操作,所以非常快。而且CAS避免了请求操作系统来裁定锁的问题,不用麻烦操作系统,直接在CPU内部就搞定了。但CAS就没有开销了吗?不!有cache miss的情况。这个问题比较复杂,首先需要了解CPU的硬件体系结构:

CAS算法在JDK中怎么应用

上图可以看到一个8核CPU计算机系统,每个CPU有cache(CPU内部的高速缓存,寄存器),管芯内还带有一个互联模块,使管芯内的两个核可以互相通信。在图中央的系统互联模块可以让四个管芯相互通信,并且将管芯与主存连接起来。数据以“缓存线”为单位在系统中传输,“缓存线”对应于内存中一个 2 的幂大小的字节块,大小通常为 32 到 256 字节之间。当 CPU 从内存中读取一个变量到它的寄存器中时,必须首先将包含了该变量的缓存线读取到 CPU 高速缓存。同样地,CPU 将寄存器中的一个值存储到内存时,不仅必须将包含了该值的缓存线读到 CPU 高速缓存,还必须确保没有其他 CPU 拥有该缓存线的拷贝。

比如,如果 CPU0 在对一个变量执行“比较并交换”(CAS)操作,而该变量所在的缓存线在 CPU7 的高速缓存中,就会发生以下经过简化的事件序列:

  • CPU0 检查本地高速缓存,没有找到缓存线。

  • 请求被转发到 CPU0 和 CPU1 的互联模块,检查 CPU1 的本地高速缓存,没有找到缓存线。

  • 请求被转发到系统互联模块,检查其他三个管芯,得知缓存线被 CPU6和 CPU7 所在的管芯持有。

  • 请求被转发到 CPU6 和 CPU7 的互联模块,检查这两个 CPU 的高速缓存,在 CPU7 的高速缓存中找到缓存线。

  • CPU7 将缓存线发送给所属的互联模块,并且刷新自己高速缓存中的缓存线。

  • CPU6 和 CPU7 的互联模块将缓存线发送给系统互联模块。

  • 系统互联模块将缓存线发送给 CPU0 和 CPU1 的互联模块。

  • CPU0 和 CPU1 的互联模块将缓存线发送给 CPU0 的高速缓存。

  • CPU0 现在可以对高速缓存中的变量执行 CAS 操作了

以上是刷新不同CPU缓存的开销。最好情况下的 CAS 操作消耗大概 40 纳秒,超过 60 个时钟周期。这里的“最好情况”是指对某一个变量执行 CAS 操作的 CPU 正好是最后一个操作该变量的CPU,所以对应的缓存线已经在 CPU 的高速缓存中了,类似地,最好情况下的锁操作(一个“round trip 对”包括获取锁和随后的释放锁)消耗超过 60 纳秒,超过 100 个时钟周期。这里的“最好情况”意味着用于表示锁的数据结构已经在获取和释放锁的 CPU 所属的高速缓存中了。锁操作比 CAS 操作更加耗时,是因深入理解并行编程

为锁操作的数据结构中需要两个原子操作。缓存未命中消耗大概 140 纳秒,超过 200 个时钟周期。需要在存储新值时查询变量的旧值的 CAS 操作,消耗大概 300 纳秒,超过 500 个时钟周期。想想这个,在执行一次 CAS 操作的时间里,CPU 可以执行 500 条普通指令。这表明了细粒度锁的局限性。

以下是cache miss cas 和lock的性能对比:

CAS算法在JDK中怎么应用

4、CAS算法在JDK中的应用

在原子类变量中,如java.util.concurrent.atomic中的AtomicXXX,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时都直接或间接的使用了这些原子变量类。

Java 1.7中AtomicInteger.incrementAndGet()的实现源码为:

CAS算法在JDK中怎么应用

CAS算法在JDK中怎么应用

由此可见,AtomicInteger.incrementAndGet的实现用了乐观锁技术,调用了类sun.misc.Unsafe库里面的 CAS算法,用CPU指令来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增。

以上就是“CAS算法在JDK中怎么应用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: CAS算法在JDK中怎么应用

本文链接: https://lsjlt.com/news/230601.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • CAS算法在JDK中怎么应用
    今天小编给大家分享一下CAS算法在JDK中怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么是CAS?CAS:C...
    99+
    2023-06-02
  • java的CAS怎么应用
    本篇内容主要讲解“java的CAS怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java的CAS怎么应用”吧!CAS解释:CAS(compare and swap),比较并交换。可以解决...
    99+
    2023-06-29
  • K-means算法怎么在Python中应用
    这篇文章将为大家详细讲解有关K-means算法怎么在Python中应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动...
    99+
    2023-06-14
  • C#中使用CAS实现无锁算法的示例详解
    目录CAS 的基本概念C# 中如何使用 CAS算法示例示例1:计数器示例2:队列总结CAS 的基本概念 CAS(Compare-and-Swap)是一种多线程并发编程中常用的原子操作...
    99+
    2023-05-16
    C#使用CAS实现无锁算法 C# CAS实现无锁算法 C# CAS 无锁算法 C# 无锁算法
  • 怎么理解散列算法在C# 加密中的应用
    怎么理解散列算法在C# 加密中的应用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。散列算法是C# 加密中经常会用到的方法,那么什么是散列算法呢?它的作用是如何实现的呢?那么...
    99+
    2023-06-17
  • 怎么在Python中使用dHash算法
    这篇文章将为大家详细讲解有关怎么在Python中使用dHash算法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
  • vue3 diff算法怎么应用
    这篇文章主要介绍“vue3 diff算法怎么应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3 diff算法怎么应用”文章能帮助大家解决问题。一、可能性(常见):旧的:a...
    99+
    2023-07-02
  • 怎么在2020Mac M1中安装jdk
    本篇文章为大家展示了怎么在2020Mac M1中安装jdk,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.下载JDK2.下载idea安装包M1的话一定要记得选择这个版本的IDEA。官方下载链接:h...
    99+
    2023-06-14
  • Vue中的双端diff算法怎么应用
    这篇文章主要讲解了“Vue中的双端diff算法怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中的双端diff算法怎么应用”吧!Vue 和 React 都是基于 vdom 的前端...
    99+
    2023-07-02
  • 怎么在keep-alive中使用LRU算法
    怎么在keep-alive中使用LRU算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。vue的keep-alive内置组件的使用也是使用了改算法,源码如下:export&...
    99+
    2023-06-15
  • C++贪心算法怎么应用
    今天小编给大家分享一下C++贪心算法怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。选择排序我们熟知的选择排序,其采用...
    99+
    2023-06-29
  • java递归算法怎么应用
    Java递归算法可以应用于以下场景:1. 阶乘计算:递归可以用来计算一个数的阶乘。例如,计算n的阶乘可以定义为f(n) = n * ...
    99+
    2023-08-09
    java
  • Python递归算法怎么应用
    递归算法是一种通过调用函数本身来解决问题的方法。在Python中,递归算法可以应用于各种问题,例如计算阶乘、斐波那契数列等。下面是一...
    99+
    2023-08-15
    Python
  • 防火墙在云计算环境中怎么应用
    在云计算环境中,防火墙起着至关重要的作用,用来保护云计算环境中的数据和网络安全。防火墙可以帮助监控和过滤网络流量,阻止不明来源的攻击...
    99+
    2024-04-16
    防火墙
  • 如何在编程中应用最新的算法?
    随着科技的发展,计算机算法已经成为我们生活中不可或缺的一部分。无论是从事软件开发、数据分析,还是进行科学研究,编程人员都需要不断地学习和应用最新的算法。在本文中,我们将探讨如何在编程中应用最新的算法。 一、 学习最新的算法 在应用最新的算法...
    99+
    2023-06-17
    教程 编程算法 numy
  • 如何在Java编程中应用算法思维?
    Java编程是一种非常流行的编程语言,它广泛应用于各种应用程序的开发。在Java编程中,算法思维是非常重要的一个方面,它可以帮助开发者更好地理解和解决问题。在本文中,我们将探讨如何在Java编程中应用算法思维,并且提供一些演示代码。 一、什...
    99+
    2023-10-25
    api 编程算法 编程算法
  • 如何在Bash中应用Python的编程算法?
    Bash和Python是两个非常流行的编程语言。Bash是一种shell脚本语言,常用于Linux和Unix系统中的命令行操作。Python是一种高级编程语言,具有良好的可读性和可维护性,被广泛应用于数据分析、机器学习、Web开发等领域。在...
    99+
    2023-10-26
    数据类型 bash 编程算法
  • python去水印算法怎么应用
    Python可以应用去水印算法来去除图片或视频中的水印。下面是一个基本的去水印算法的示例:1. 导入必要的库:pythonimpor...
    99+
    2023-10-23
    python
  • 怎么在CentOS系统中安装jdk 1.6
    这篇文章将为大家详细讲解有关怎么在CentOS系统中安装jdk 1.6,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。系统:centos 5.5 (32位)需要的软件包:jdk-6u32-li...
    99+
    2023-06-07
  • 在云服务器中怎么配置jdk
    要在云服务器中配置JDK,可以按照以下步骤进行:1. 登录到云服务器。可以使用SSH客户端(如PuTTY)连接到云服务器。2. 下载...
    99+
    2023-09-16
    云服务器 jdk
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作