并发编程(十五):原子操作之AtomicInteger 浅浅的花香味﹌ 2023-06-04 11:50 2阅读 0赞 # 一,Atomic 概述 # ## 1,原子类 ## \* JUC中提供了一系列原子类,通过CAS在多线程环境下来保证原子操作,此处只对 AtomicInteger进行简单分析 ![20191022152652610.png][] ## 2,常用API ## \* 同时,Atomic类提供了一系列API来保障原子操作,但是殊途同归,底层都是通过CAS来实现,只是提供了更多的功能而已,此处仅列出部分。可以看到涉及常规的数据变更 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE5NzYzODg_size_16_color_FFFFFF_t_70][] ## 3,功能DEMO ## \* 多执行几次可以发现,原子类结果永远一直,而可见变量则可能会吞数据,就是因为没有保证原子性 package com.asdc.mtTest_1; import java.util.concurrent.atomic.AtomicInteger; /** * @author LiYanBin * @create 2019-10-22 15:29 **/ public class AtomicIntegerTest { // 原子类递增 private static AtomicInteger atomicInteger = new AtomicInteger(); // 普通线程可见参数 static volatile int count = 0; public static void main(String[] args) { for (int i = 0; i < 1000; i++) { new Thread(() -> { // 普通变量递增 count++; // 原子变量递增 atomicInteger.incrementAndGet(); System.out.println(Thread.currentThread().getName() + " : " + atomicInteger.get() + ", count: " + count); }, "THREAD_" + i).start(); } } } ![20191022154450488.png][] # 二,源码分析 # ## 1,incrementAndGet():原子类内部操作统一都是通过CAS完成,直接通过CAS进行数据替换 ## public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1; } public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; } ## 2,其他API基本类似,不再分析 ## [20191022152652610.png]: /images/20230601/7c38771713e44b808891b6d3e3aa58f5.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE5NzYzODg_size_16_color_FFFFFF_t_70]: /images/20230601/27f3d9600af44e63ae45886b5da72ff1.png [20191022154450488.png]: /images/20230601/16f62763fe3446a9a1f8bcccf1dd2dd8.png
还没有评论,来说两句吧...