【并发】第四篇 AtomicInteger原子操作

导航

    • 一. 简介
    • 二. 源码分析
    • 三. 原子操作原理
    • 三. 实际用途
      • 1. 标志位
      • 2. 唯一标识生成器
      • 3. 计数器

在这里插入图片描述

一. 简介

AtomicInteger是Java中提供的一种线程安全原子操作类,用来实现对整数类型的原子操作。它可以在多线程环境下保证对整数的原子性操作,而不需要使用synchronized关键字或者其他锁机制

二. 源码分析

JDK1.8 中AtomicInteger源码:

public class AtomicInteger extends Number implements java.io.Serializable {
   
  private static final long serialVersionUID = 6214790243416807050L;

  /**
   * Unsafe类是一个提供了一组低级别的操作方法的工具类。
   * 它允许我们绕过Java语言的安全限制,直接操作底层的内存和对象
   * 1.直接读写内存:Unsafe类中的方法可以直接读写内存,包括读写基本数据类型、读写对象引用和执行内存复制等。
   * 2.分配和释放内存:Unsafe类提供了分配和释放内存的方法,可以手动控制内存的分配和释放,而不依赖于JVM的垃圾回收机制。
   * 3.对象操作:Unsafe类的方法可以直接操作对象,例如获取和设置对象的字段值、获取对象的地址、创建对象实例等。
   * 4.线程同步和CAS操作:Unsafe类提供了一些原子操作方法,可以用于实现线程同步和CAS(Compare and Swap)操作,用于实现高效的并发编程。
   * 
   */
  private static final Unsafe unsafe = Unsafe.getUnsafe();
  private static final long valueOffset;

  static {
   
      try {
   
          valueOffset = unsafe.objectFieldOffset
              (AtomicInteger.class.getDeclaredField("value"));
      } catch (Exception ex) {
    throw new Error(ex); }
  }
  
  /**
   * 内部使用的volatile修饰符保证线程可见性
   * volatile是一种轻量级的同步机制,适用于简单变量的读写,可以提供变量的可见性和有序性
   */
  private volatile int value;

  /**
   * 构造方法,初始化value值
   */
  public AtomicInteger(int initialValue) {
   
      value = initialValue;
  }

  /**
   * 构造方法,使用默认初始值0
   */
  public AtomicInteger() {
   
  }
  //......省略.......
}

AtomicInteger类提供了多种方法来对整数进行原子操作,常用的方法有:

  1. get() : 获取当前的整数值
 public final int get() {
   
     return value;
 }
  1. set(int newValue):设置新的整数值
public final void set(int newValue) {
   
       value = newValue;
 }
  1. getAndSet(int newValue):设置新的整数值,并返回原来的值。
public final int getAndSet(int newValue) {
   
     return unsafe.getAndSetInt(this, valueOffset, newValue);
 }
  1. compareAndSet(int expect, int update):如果当前值等于expect,则将当前值设置为update,返回更新是否成功。
public final boolean compareAndSet(int expect, int update) {
   
    return unsafe.compareAndSwapInt(this

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量…

抖店运营没有销量?想要快速拉高,产品部分一定做好!

大家好,我是电商小布。 我们开通抖音小店,运营店铺的最终目的,都是为了顺利实现转化。 但是有的小伙伴在开店运营之后,发现自己的店铺在销量上并没有什么起色在。 出现这个情况是怎么回事呢? 之前就有给大家说过&a…

寻找伙伴/拓展业务/开拓市场 2024CBTC上海国际储能展,为您提供海量商机!

在全球能源转型的背景下,电力市场正在经历一场前所未有的大变革,以储能为核心的新型电力系统建设正成为能源转型的重要抓手,给电力及新能源行业带来更多机遇。 由湖南省电池产业协会、中国设备管理协会、沪粤储能产业联盟、深圳国际投融资商…

零售行业数字化广告评价标准 - 《IAB/MRC零售(广告)测量指南》

IAB/MRC零售(广告)测量指南 --- 最新标准,2024年1月发布 目录 1出台此标准的目的是什么?2标准宗旨3本标准的主要关键领域4为什么这对品牌和零售商很重要5能给零售媒体中小型玩家带来什么机会?6评价零售媒体效果的最…

React - 你知道useffect函数内如何模拟生命周期吗

难度级别:中级及以上 提问概率:65% 很多前端开发人员习惯了Vue或者React的组件式开发,熟知组件的周期过程包含初始化、挂载完成、修改和卸载等阶段。但是当使用Hooks做业务开发的时候,看见一个个useEffect函数,却显得有些迷茫,因为在us…

人工智能的分类有哪些

人工智能(AI)可以根据不同的分类标准进行分类。以下是一些常见的分类方法: 1. **按功能分类**: - 弱人工智能(Narrow AI):也称为狭义人工智能,指专注于执行特定任务的AI系统&…

富文本编辑器的下载安装使用

为什么选择vue-quill-editor? 在众多的富文本编辑器中,vue-quill-editor因其易用性、灵活性以及对Vue框架友好的特性而受到开发者的青睐。它基于Quill编辑器,Quill是一款现代的WYSIWYG(所见即所得)编辑器,…

GFS分布式文件系统概述以及集群部署

一.简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。 传统的分布式文件系统大多通过元服务器来存储元数据&a…

嵌入式路由器:支持Vxlan功能,四大运营商网络

SR830-E系列产品,是集 4G/5G 网络、虚拟专用网等 技术于一体的物联网无线路由器产品。多DNN网络切片功能,满足行业应用差异化需求提供网络级的SLA保障及E2E安全隔离。该设备支持Vxlan功能,实际二层交换组网。为数据中心提供良好的解决方案。 …

西圣PK飞利浦PK漫步者开放式耳机值得选购吗?热门爆款品牌测评对比PK

开放式耳机因其独特的音质体验与佩戴舒适度,正逐渐成为消费者追求音乐品质与生活品质的重要选择,而在众多开放式耳机品牌中,万魔、飞利浦与漫步者在开放式耳机市场争议火热,这三大品牌开放式耳都值得购买吗?作为一个测…

C++进阶之路---何为智能指针?

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下&am…

Z变换与传递函数代码化

对于自动控制而言,其关键在于传递函数方程,根据其特性设计出控制器,控制器也是S域的传递函数,那么如何将传递函数用代码的形式表现出来呢?以下将介绍这种工程方法 1、Z变换 对于一个确定的传递函数,如下 …

【知识面拓展】:前瞻性

前瞻性 AUTOSEMO大陆集团博士其他 AUTOSEMO AUTOSEMO,中国汽车基础软件生态委员会 . 车企、软件、芯片等各嘉宾观点 . 国产芯片之:芯驰科技构建智能汽车数字化生态平台 . 国产软件之:经纬恒润的全栈思考 大陆集团 大陆集团新闻稿链接 . 1、2…

✌2024/4/3—力扣—最长回文子串

代码实现: 解法一:动态规划——回文子串 char* longestPalindrome(char *s) {int n strlen(s);if (s NULL || n 0 || n 1) {return s;}int dp[n][n];memset(dp, 0, sizeof(dp));for (int i n - 1; i > 0; i--) { // 从下到上for (int j i; j &l…

emqx开启自定义权限认证

emqx开启自定义权限认证 emqx broker安装 emqx 集群搭建 浏览器访问WEB管理界面: http://127.0.0.1:18083/ 默认用户名和密码: admin/public 建议修改 开启emqx_auth_http插件 修改emq配置 #修改emqx/etc/emqx.conf #禁用匿名认证 生产环境建议禁用 allow_anonymous fa…

十四款大型语言模型在《街头霸王III》中一决雌雄

上周在旧金山举办的Mistral AI黑客马拉松上,开发出了一款基于经典街机游戏《街头霸王III》的人工智能(AI)基准测试。这款名为“AI Street Fighter III”的开源基准测试由Stan Girard和Quivr Brain开发,游戏在模拟器中运行&#xf…

三体续章-云天明传:【9】十年铸剑

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

基于Java+SpringBoot+Vue企业员工管理系统(源码+文档+部署+讲解)

一.系统概述 随着社会的发展,系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息,但各种信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得信息,因此,设计一种安全高效的员工管理系统极为重要。 为设计…

蓝桥杯练习笔记(十八)

蓝桥杯练习笔记(十八) 一、用辅助栈来优化递归深度过大的问题 输入示例 0000100010000001101010101001001100000011 0101111001111101110111100000101010011111 1000010000011101010110000000001011010100 0110101010110000000101100100000101001001 0…

React安装

React中文官网:快速入门 – React 中文文档 React英文官网:https://react.dev/learn React安装教程:https://www.jianshu.com/p/0784e619a186 一、环境配置 安装nodejs 下载网址:Node.js — Run JavaScript Everywhere 下载安…