>  기사  >  Java  >  Java 동시 프로그래밍: JUC 툴킷의 AtomicInteger Atomic Integer 사용 사례 분석

Java 동시 프로그래밍: JUC 툴킷의 AtomicInteger Atomic Integer 사용 사례 분석

WBOY
WBOY앞으로
2023-04-25 22:22:30873검색

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제