程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • Java 面经

    • Java基础
    • Java集合
    • Java并发
    • JVM面试题
    • MySQL面试题
    • Redis面试题
    • MQ面试题
    • Spring面试题
    • Mybatis面试题
    • Dubbo面试题
    • 分布式面试题
    • 操作系统面试题
    • 计算机网络面试题
    • 高频场景面试题
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • Java 面经

    • Java基础
    • Java集合
    • Java并发
    • JVM面试题
    • MySQL面试题
    • Redis面试题
    • MQ面试题
    • Spring面试题
    • Mybatis面试题
    • Dubbo面试题
    • 分布式面试题
    • 操作系统面试题
    • 计算机网络面试题
    • 高频场景面试题
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Java基础

  • Java集合

  • Java并发

    • Java多线程高频面试题
    • 线程池高频面试题
    • AQS 高频面试题
    • 进程通信和线程通信的方式
    • 如何设计线程池
    • AQS专栏
    • Atomic 原子类
      • 1. 介绍一下 Atomic 原子类
      • 2. JUC 包中的原子类是哪4类?
      • 3. 简单介绍一下 AtomicInteger 类的原理
  • JVM

  • MySQL

  • Redis

  • MQ

  • Spring

  • Mybatis

  • Dubbo

  • 分布式

  • 操作系统

  • 计算机网络

  • 高频场景题

  • Java面试题
  • Java并发
scholar
2025-01-04
目录

Atomic 原子类

# Atomic 原子类

# 1. 介绍一下 Atomic 原子类

Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。

所以,所谓原子类说简单点就是具有原子 / 原子操作特征的类。

并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下:

atomic

# 2. JUC 包中的原子类是哪4类?

基本类型 使用原子的方式更新基本类型:

  • AtomicInteger : 整型原子类
  • AtomicLong: 长整型原子类
  • AtomicBoolean: 布尔型原子类

数组类型 使用原子的方式更新数组里的某个元素:

  • AtomicIntegerArray: 整型数组原子类
  • AtomicLongArray: 长整型数组原子类
  • AtomicReferenceArray: 引用类型数组原子类

引用类型 使用原子的方式更新引用类型:

  • AtomicReference: 引用类型原子类
  • AtomicStampedReference: 原子更新带有版本号的引用类型。该类将整型数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
  • AtomicMarkableReference: 原子更新带有标记位的引用类型。对象属性修改类型
  • AtomicIntegerFieldUpdater: 原子更新整型字段的更新器
  • AtomicLongFieldUpdater: 原子更新长整型字段的更新器
  • AtomicMarkableReference: 原子更新带有标记位的引用类型

# 3. 简单介绍一下 AtomicInteger 类的原理

AtomicInteger 类主要利用 CAS和 volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

AtomicInteger 类的部分源码:

  // 更新操作时提供“比较并替换”的作用
  private static final Unsafe unsafe = Unsafe.getUnsafe();

  private static final long valueOffset;

  static {
      try{
          valueOffset = unsafe.objectFieldOffset(AutomicInteger.class.getDeclaredField("value"));
      }catch(Exception ex){
          throw new Error(ex);
      }
  }

  private volatile int value;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
编辑此页 (opens new window)
上次更新: 2025/01/05, 02:09:04
AQS专栏
JVM 高频面试题

← AQS专栏 JVM 高频面试题→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式