찾다
Javajava지도 시간Java 동시 프로그래밍: JUC 툴킷의 AtomicInteger Atomic Integer 사용 사례 분석

    AtomicInteger 클래스는 하단에 int 값을 저장하고 int 값에 대해 원자적 연산을 수행하는 메서드를 제공합니다. AtomicInteger는 Java 1.5에서 java.util.concurrent.atomic 패키지의 일부로 도입되었습니다. java.util.concurrent.atomic包的一部分,从Java 1.5开始引入。

    1. AtomicInteger基础用法

    通过下文的AtomicInteger构造方法,可以创建一个AtomicInteger对象,该对象的初始值默认为0。AtomicInteger提供get和set方法,获取底层int整数值,与设置int整数值

    //初始值为0的atomicInteger对象
    AtomicInteger atomicInteger = new AtomicInteger();  
    //初始值为200的atomicInteger对象
    AtomicInteger atomicInteger = new AtomicInteger(200);
    int currentValue = atomicInteger.get();         //100
    atomicInteger.set(2453);                        //现在的值是 2453

    但是上面的方法,对于AtomicInteger而言并不是它的核心内容,AtomicInteger核心内容体现在它的原子性,我们下文介绍。

    2. 什么时候需要使用AtomicInteger

    我们通常在以下的两种场景下使用AtomicInteger

    多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。

    进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。

    2.1. 原子计数器场景

    AtomicInteger作为一个计数器使用,AtomicInteger提供了若干方法进行加法、减法的原子操作。

    比如从一个map里面获取值,用get()方法,这是第一个操作;获取到值之后给这个值加上n,这是第二个操作;将进行过加法运算的值,再次放入map里面是第三个操作。所谓操作的原子性是指:在多线程并发的场景下,上面的三个操作是原子性的,也就是不可分割的。不会出现A线程get了数值,B线程同时也get到了该数值,两个线程同时为该值做运算并先后再次放入的情况,这种情况对于AtomicInteger而言是不会出现的,AtomicInteger操作是线程安全的、不可分割的。

    addAndGet()- 将给定的值加到当前值上,并在加法后返回新值,并保证操作的原子性。

    getAndAdd()- 将给定的值加到当前值上,并返回旧值,并保证操作的原子性。

    incrementAndGet()- 将当前值增加1,并在增加后返回新值。它相当于++i操作,并保证操作的原子性。

    getAndIncrement()- 将当前值增加1并返回旧值。相当于++i操作,并保证操作的原子性。

    decrementAndGet()- 将当前值减去1,并在减去后返回新值,相当于i--操作,并保证操作的原子性。

    getAndDecrement()- 将当前值减去1,并返回旧值。它相当于 --i操作,并保证操作的原子性。

    下面是AtomicInteger原子性操作方法的例子

    public class Main {
        public static void main(String[] args) {
            //初始值为100的atomic Integer
            AtomicInteger atomicInteger = new AtomicInteger(100);
            System.out.println(atomicInteger.addAndGet(2));         //加2并返回102
            System.out.println(atomicInteger);                      //102
            System.out.println(atomicInteger.getAndAdd(2));         //先获取102,再加2
            System.out.println(atomicInteger);                      //104
            System.out.println(atomicInteger.incrementAndGet());    //加1再获取105   
            System.out.println(atomicInteger);                      //105   
            System.out.println(atomicInteger.getAndIncrement());    //先获取105再加1
            System.out.println(atomicInteger);                      //106
            System.out.println(atomicInteger.decrementAndGet());    //减1再获取105
            System.out.println(atomicInteger);                      //105
            System.out.println(atomicInteger.getAndDecrement());    //先获取105,再减1
            System.out.println(atomicInteger);                      //104
        }
    }

    2.2. 数值比对及交换操作

    compareAndSet操作将一个内存位置的内容与一个给定的值进行比较,只有当它们相同时,才会将该内存位置的内容修改为一个给定的新值。这个过程是以单个原子操作的方式完成的。

    compareAndSet方法:如果当前值==预期值,则将值设置为给定的更新值。

    boolean compareAndSet(int expect, int update)

    expect是预期值

    update是更新值

    AtomicInteger compareAndSet() 方法的例子

    import java.util.concurrent.atomic.AtomicInteger;
    public class Main {
        public static void main(String[] args) {
            //初始值为100的atomic Integer
            AtomicInteger atomicInteger = new AtomicInteger(100);
            //当前值100 = 预期值100,所以设置atomicInteger=110
            boolean isSuccess = atomicInteger.compareAndSet(100,110);  
            System.out.println(isSuccess);      //输出结果为true表示操作成功
            //当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110
            isSuccess = atomicInteger.compareAndSet(100,120);  
            System.out.println(isSuccess);      //输出结果为false表示操作失败
        }
    }

    3. 总结

    AtomicInteger可以帮助我们在不使用synchronized同步锁的情况下,实现在多线程场景下int数值操作的线程安全,操作的原子性。并且使用AtomicInteger来实现int数值的原子操作,远比使用synchronized同步锁效率更高。

    java.util.concurrent.atomic包不仅为我们提供了AtomicInteger

    1. AtomicInteger의 기본 사용법

    아래 AtomicInteger 생성자를 통해 초기값이 0인 AtomicInteger 객체를 생성할 수 있습니다. . AtomicInteger는 기본 int 정수 값을 얻고 int 정수 값을 설정하는 get 및 set 메소드를 제공합니다🎜rrreee🎜그러나 위 메소드는 AtomicInteger의 핵심 내용이 아닙니다. AtomicInteger의 내용은 원자성에 반영되는데, 이에 대해서는 아래에서 소개하겠습니다. 🎜

    2. AtomicInteger를 사용해야 하는 경우

    🎜우리는 일반적으로 다음 두 가지 시나리오에서 AtomicInteger를 사용합니다.🎜🎜멀티 스레드 동시 시나리오에서 카운터를 작동하려면 다음이 필요합니다. 카운터 작업 Atomic을 보장합니다. 🎜🎜 숫자 비교를 수행합니다. 주어진 값이 현재 값과 같으면 숫자 값에 대한 업데이트 작업을 수행하고 해당 작업에 대한 비차단 알고리즘을 구현합니다. 🎜

    2.1. 원자 카운터 시나리오

    🎜AtomicInteger를 카운터로 사용하세요. AtomicInteger는 덧셈과 뺄셈의 원자 연산을 수행하는 여러 가지 방법을 제공합니다. 🎜🎜예를 들어, 맵에서 값을 얻으려면 첫 번째 작업인 get() 메서드를 사용하고, 값을 가져온 후 두 번째 작업인 값에 n을 추가하고 Putting을 수행합니다. 지도에 넣는 것이 세 번째 작업입니다. 소위 작업의 원자성이란 다중 스레드 동시성 시나리오에서 위의 세 가지 작업이 원자성, 즉 분할할 수 없음을 의미합니다. 스레드 A가 값을 가져오고 스레드 B도 동시에 값을 가져오는 상황은 없습니다. 두 스레드가 동시에 값에 대한 작업을 수행하고 차례로 다시 입력하는 상황입니다. >AtomicInteger 아니요, AtomicInteger 작업은 스레드로부터 안전하고 분할할 수 없습니다. 🎜🎜addAndGet()- 주어진 값을 현재 값에 추가하고 추가 후 새 값을 반환하여 작업의 원자성을 보장합니다. 🎜🎜getAndAdd()- 주어진 값을 현재 값에 추가하고 이전 값을 반환하여 작업의 원자성을 보장합니다. 🎜🎜incrementAndGet()- 현재 값을 1만큼 늘리고 증가 후 새 값을 반환합니다. 이는 ++i 작업과 동일하며 작업의 원자성을 보장합니다. 🎜🎜getAndIncrement() - 현재 값을 1만큼 늘리고 이전 값을 반환합니다. ++i 작업과 동일하며 작업의 원자성을 보장합니다. 🎜🎜decrementAndGet()- 현재 값에서 1을 빼고 빼기 후 새 값을 반환합니다. 이는 i-- 연산과 동일하며 연산의 원자성을 보장합니다. . 🎜🎜getAndDecrement()- 현재 값에서 1을 빼고 이전 값을 반환합니다. 이는 --i 작업과 동일하며 작업의 원자성을 보장합니다. 🎜🎜다음은 AtomicInteger🎜rrreee

    2.2의 원자 연산 방법의 예입니다. 숫자 비교 및 ​​교환 연산

    🎜compareAndSet 연산은 메모리 위치의 내용을 주어진 값과 비교합니다. 동시에 메모리 위치의 내용은 주어진 새로운 값으로 수정됩니다. 이 프로세스는 단일 원자 작업으로 완료됩니다. 🎜🎜compareAndSet 메서드: 현재 값 == 예상 값인 경우 값을 주어진 업데이트 값으로 설정합니다. 🎜rrreee🎜expect는 예상 값이고 🎜🎜update는 업데이트된 값입니다. 🎜🎜AtomicInteger CompareAndSet() 메서드의 예🎜rrreee

    요약 h3>🎜AtomicInteger는 동기화된 동기화 잠금을 사용하지 않고도 다중 스레드 시나리오에서 int 수치 연산의 스레드 안전성과 원자성을 달성하는 데 도움이 됩니다. 그리고 AtomicInteger를 사용하여 int 값에 대한 원자 연산을 구현하는 것이 동기화된 동기화 잠금을 사용하는 것보다 훨씬 더 효율적입니다. 🎜🎜java.util.concurrent.atomic 패키지는 AtomicInteger를 제공할 뿐만 아니라 AtomicBoolean 부울 원자 연산 클래스, AtomicLong 긴 정수 부울 원자 연산 클래스 및 AtomicReference도 제공합니다. 객체 원자 연산 클래스, AtomicIntegerArray 정수 배열 원자 연산 클래스, AtomicLongArray 긴 정수 배열 원자 연산 클래스, AtomicReferenceArray 객체 배열 원자 연산 클래스. 🎜

    위 내용은 Java 동시 프로그래밍: JUC 툴킷의 AtomicInteger Atomic Integer 사용 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

    Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

    完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

    一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

    详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

    本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

    Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

    java中封装是什么java中封装是什么May 16, 2019 pm 06:08 PM

    封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

    归纳整理JAVA装饰器模式(实例详解)归纳整理JAVA装饰器模式(实例详解)May 05, 2022 pm 06:48 PM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    뜨거운 도구

    에디트플러스 중국어 크랙 버전

    에디트플러스 중국어 크랙 버전

    작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구

    ZendStudio 13.5.1 맥

    ZendStudio 13.5.1 맥

    강력한 PHP 통합 개발 환경

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    mPDF

    mPDF

    mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.