首页 > 其他分享 >CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?

CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?

时间:2023-03-19 15:13:54浏览次数:33  
标签:CAS AtomicInteger 原子 int 内存 多线程

Compare And Swap,比较交换。可以看到 synchronized 可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile 不能保证原子性,只能在某些场合下使用。所以可以通过 CAS 来进行同步,保证原子性。

我们在读 Concurrent 包下的类的源码时,发现无论是 ReentrantLock 内部的 AQS,还是各种 Atomic 开头的原子类,内部都应用到了 CAS。

在 CAS 中有三个参数:内存值 V、旧的预期值 A、要更新的值 B ,当且仅当内存值 V 的值等于旧的预期值 A 时,才会将内存值 V 的值修改为 B,否则什么都不干。

CAS 可以保证一次的读-改-写操作是原子操作。

在多线程环境下,int 类型的自增操作不是原子的,线程不安全,可以使用 AtomicInteger 代替。

 

标签:CAS,AtomicInteger,原子,int,内存,多线程
From: https://www.cnblogs.com/xfeiyun/p/17233085.html

相关文章

  • OpenCASCADE-曲面求交
    OpenCASCADE-曲面求交[email protected]:曲面求交是几何造型内核最为重要也最为复杂的问题之一,求交算法的质量(稳定、准确、快速)直接影响到几何内核的稳定性和实用程......
  • EF Core Error:Unable to cast object of type ‘System.DBNull‘ to type ‘System.S
    (163条消息)EFCoreError:Unabletocastobjectoftype‘System.DBNull‘totype‘System.String‘_webmote的博客-CSDN博客 <PropertyGroup><TargetFramew......
  • 多线程篇-交替打印
    背景有如下需求:线程1打印5次a,线程2打印5次b,线程3打印5次c,要求最后的结果是abcabcabcabc步骤简单情况先考虑简单的情况,然后进行拓展。简单版需求:线程1打印1,线程2......
  • Day 17 17.3 多线程实现之线程池
    多线程实现之线程池1引入系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量......
  • switch...case跳转表
    0.本文结构概述switch...case语法格式C和C++的switch不同点switch...case反汇编switch...case跳转表case值间距过大不用跳转表1.switch...case语句switch(表达......
  • 多线程编程五:信号量
    2.33.信号量的概念_哔哩哔哩_bilibili2.34.信号量的工作机制_哔哩哔哩_bilibili......
  • 多线程基础
     基本概念:程序、进程、线程程序(program):为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process):是指一个内存中运行......
  • c++ 影响多线程速度的因素记录
    目录0.序言1.缓存行同步问题/共享数据竞争1.1测试代码1.2测试逻辑1.3测试结果1.4小结2.任务颗粒度过小问题2.1测试代码2.1测试逻辑2.2测试结果2.3小结3.缓存未......
  • 乌克兰学者的学术图谱case1
     0.人物:米哈伊洛·兹古罗夫斯基MykhailoZakharovychZghurovskyi,也拼写为MykhailoZgurovsky,(乌克兰语:МихайлоЗахаровичЗгуровський),乌克......
  • android CellbroadCast涉及的文件有哪些
    UI相关文件:CBMessage.javaCBMessageItem.javaCBMessageListActivity.javaCBMessageListAdapter.javaCBMessageListItem.java 收发相关......