📌  相关文章
📜  Java中的 AtomicIntegerArray decrementAndGet() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:31:49.917000             🧑  作者: Mango

Java中的AtomicIntegerArray decrementAndGet()方法及示例

在Java中,AtomicIntegerArray是一个原子数组,在多线程环境下用于实现原子操作。AtomicIntegerArray里的所有操作都是原子性的,可以避免线程安全问题。其中,decrementAndGet()方法是用来对数组中指定下标的元素进行减1并获取结果值的方法。

方法定义

decrementAndGet()方法的定义如下:

public final int decrementAndGet(int i)

该方法的作用是:对于AtomicIntegerArray数组中的第i个值,将它减1,并返回减1后的结果值。

方法参数

decrementAndGet()方法的参数是数组下标i,表示要对第i个元素进行减1操作。

方法返回值

decrementAndGet()方法的返回值是减1后的结果值。返回的结果值是改变后的值。

当多个线程同时执行decrementAndGet()方法时,会有一个线程获得锁,对于其他线程,将被阻塞等待锁的释放。

示例代码

下面是一个使用decrementAndGet()方法的示例代码:

import java.util.concurrent.atomic.AtomicIntegerArray;

public class AtomicIntegerArrayDemo {

    static AtomicIntegerArray array = new AtomicIntegerArray(5);

    public static void main(String[] args) {

        //设置数组的初始值
        for (int i = 0; i < array.length(); i++) {
            array.set(i, i+1);
        }

        //创建10个线程,每个线程对数组中的一个值进行减1操作
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                int index = (int) (Math.random() * array.length());
                int oldValue = array.get(index);
                int newValue = array.decrementAndGet(index);
                System.out.println(Thread.currentThread().getName()
                        + ", oldValue: " + oldValue
                        + ", decrementAndGet: " + newValue);
            }).start();
        }
    }
}

输出结果如下:

Thread-8, oldValue: 3, decrementAndGet: 2
Thread-9, oldValue: 5, decrementAndGet: 4
Thread-5, oldValue: 2, decrementAndGet: 1
Thread-7, oldValue: 1, decrementAndGet: 0
Thread-6, oldValue: 4, decrementAndGet: 3
Thread-2, oldValue: 4, decrementAndGet: 2
Thread-4, oldValue: 1, decrementAndGet: 0
Thread-3, oldValue: 3, decrementAndGet: 2
Thread-1, oldValue: 2, decrementAndGet: 1
Thread-0, oldValue: 5, decrementAndGet: 4

从示例代码中可以看出,10个线程对数组中的5个值进行减1操作后,每个值都减了10次,而且减1后的结果值都是正确的。如果不使用AtomicIntegerArray类进行原子操作的话,就会出现线程安全问题,导致程序出错。

结论

decrementAndGet()方法可以用于在多线程环境下安全地执行数组元素的减1操作。使用AtomicIntegerArray类可以避免线程安全问题。