📅  最后修改于: 2023-12-03 15:31:49.864000             🧑  作者: Mango
在Java中,有时需要对整数进行原子操作。例如,在多线程环境中,多个线程可能需要并发地对同一个整数进行操作。为了保证线程安全和避免竞争条件,可以使用AtomicInteger类。其中有一个方法叫做decrementAndGet(),下面我就来详细介绍一下。
AtomicInteger类是Java提供的一个用来支持多线程环境中整数原子操作的类,它提供了一些方法来支持整数的原子操作。这些方法包括:
decrementAndGet()方法用于将AtomicInteger对象的值减1,并返回减1后的值。这个方法是原子性的,也就是说,多个线程可以同时调用这个方法,但不会产生竞争条件。
下面是一个简单的示例,使用AtomicInteger类和decrementAndGet()方法来模拟一个票务系统,多个线程从一个Ticket对象中获取并购买票:
import java.util.concurrent.atomic.AtomicInteger;
public class Ticket {
private AtomicInteger count = new AtomicInteger(10);
public int getAndDecrement() {
return count.getAndDecrement();
}
}
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
int cnt = ticket.getAndDecrement();
if (cnt > 0) {
System.out.println(Thread.currentThread().getName() + ": 购买了一张票,剩余 " + cnt + " 张");
} else {
System.out.println(Thread.currentThread().getName() + ": 票已售完");
}
}).start();
}
}
}
在这个示例中,Ticket类中使用AtomicInteger对象count来记录剩余的票数。getAndDecrement()方法被多个线程调用,以原子方式获取并减少count的值。执行结果如下:
Thread-3: 购买了一张票,剩余 7 张
Thread-8: 购买了一张票,剩余 6 张
Thread-5: 购买了一张票,剩余 5 张
Thread-0: 购买了一张票,剩余 4 张
Thread-7: 购买了一张票,剩余 3 张
Thread-2: 购买了一张票,剩余 2 张
Thread-6: 购买了一张票,剩余 1 张
Thread-9: 购买了一张票,剩余 0 张
Thread-4: 票已售完
Thread-1: 票已售完
使用AtomicInteger类的decrementAndGet()方法可以安全地进行整数的减少操作,避免了多线程环境下的竞争条件,保证了程序的线程安全性。