首页 > 编程语言 >JAVA原子类 AtomicInteger

JAVA原子类 AtomicInteger

时间:2022-12-20 17:33:38浏览次数:52  
标签:var5 JAVA CAS AtomicInteger 原子 原语 2019 atomicInteger

JAVA原子类

java原子类位于:JUC包(java.util.concurrent.atomic.Atomic*)中

举例:
class AtomicInteger extends Number implements java.io.Serializable

import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {
    public static void main(String[] args) {
        // 原始值为 5
        AtomicInteger atomicInteger = new AtomicInteger(5);
        // 因为原始值和期望值相等,则更新值为 2019
        System.out.println(atomicInteger.compareAndSet(5,2019) + " current : " + atomicInteger.get());
        // 由于上述已经将值改为 2019,所以与期望值比较不相等,不能更新值
        System.out.println(atomicInteger.compareAndSet(5,1024) + " current : " + atomicInteger.get());
        // 获取最后修改成功的值
        System.out.println(atomicInteger.getAndIncrement());
    }
}
输出:
true current 2019
false current 2019
2019

原子类原理

Unsafe是 CAS 的核心类,CAS 的全称为 Compare-And-Swap,它是一条 CPU 并发原语。由于 Java 方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe 相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe 类存在于 sun.misc 包中,其内部方法操作可以像 C 的指针一样直接操作内存。CAS 并发原语体现在 Java 语言中就是 sun.misc.Unsafe 类中的各个方法,调用 Unsafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。这是一种完全依赖于 硬件 的功能,通过它实现了原子操作。再次强调,由于 CAS 是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说 CAS 是一条 CPU 的原子指令,不会造成所谓的数据不一致问题。
核心代码:

public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        // 获取当前对象和内存地址偏移量
        var5 = this.getIntVolatile(var1, var2);
        // 如果当前对象(var1)的值(var2)跟(var5)一样,那么(var5 + 1)
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

其实有个问题:就是上面这个while如果不成功,会一直循环下去吗?不知道大家知不知道答案

标签:var5,JAVA,CAS,AtomicInteger,原子,原语,2019,atomicInteger
From: https://www.cnblogs.com/bigjor/p/16994661.html

相关文章

  • java—Cron表达式范例
    1.cronExpression配置说明字段允许值允许的特殊字符 秒0-59,-*/ 分0-59,-*/ 小时0-23,-*/ 日期1-31,-*?/LWC 月份1-12或者JAN-DEC,-......
  • vscode 调试 C++/JavaScript
     MicrosoftVisualStudioCode  在调试JavaScript代码时,其中三种比较简单:1.使用Chrome等浏览器调试2. 使用Ctrl+Shift+B 快捷键运行html文件,需要在Task......
  • JavaScript 逆向 ( 一 ) --- JavaScript 语法基础
    1、JavaScript基础菜鸟教程JavaScript教程:​​https://www.runoob.com/js/js-tutorial.html​​1.基础数据类型:number、string、boolean、null、undefined、object2.顺......
  • Java内部类详解
    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法......
  • 浅析Java中的final关键字
    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。......
  • Java 如何有效地避免OOM:善于利用软引用和弱引用
    想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题。下......
  • java中的模板设计模式【抽象类的最佳实践】
    本文主要讲述抽象类最佳实践,模板设计模式。老韩的介绍:示例代码如下:1/**2*需求:计算出执行一个job()方法,所需要花费的时间.3*使用模板设计模式【抽......
  • [新手向]Java的一个新手天坑
    Java新手天坑!想写一篇新手避坑向的文章很久了,最近来到园子,终于有机会发表这篇文章了(文笔和技术都不咋地,大佬见谅,适用于刚入坑没多久的新手群体)在java中,经过一段学习的人......
  • JAVA Thread.sleep(0)深入理解
    JAVA并发-Thread.sleep(0)深入理解Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。通过调用Thread.sleep(0)的目的是为了让GC线程有机会被操作......
  • java -贪心
     给定一个字符串,一个K 可以交换相邻字符,最多K次。问可以得到的最大值如 Strings="01326";intk=7;  01326-->60132-->63012-->63102importjava.util......