📅  最后修改于: 2023-12-03 15:31:49.917000             🧑  作者: Mango
在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类可以避免线程安全问题。