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

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

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

在Java中,有时需要对整数进行原子操作。例如,在多线程环境中,多个线程可能需要并发地对同一个整数进行操作。为了保证线程安全和避免竞争条件,可以使用AtomicInteger类。其中有一个方法叫做decrementAndGet(),下面我就来详细介绍一下。

AtomicInteger类

AtomicInteger类是Java提供的一个用来支持多线程环境中整数原子操作的类,它提供了一些方法来支持整数的原子操作。这些方法包括:

  • incrementAndGet(): 增加一个整数并返回增加后的值。
  • decrementAndGet(): 减少一个整数并返回减少后的值。
  • getAndIncrement(): 获取一个整数并增加它。
  • getAndDecrement(): 获取一个整数并减少它。
  • addAndGet(int delta): 增加指定的值并返回增加后的值。
  • getAndAdd(int delta): 获取一个整数并增加指定的值。
  • compareAndSet(int expect, int update): 如果当前值等于expect,则将当前值设置为update,并返回true,否则返回false。
decrementAndGet()方法

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()方法可以安全地进行整数的减少操作,避免了多线程环境下的竞争条件,保证了程序的线程安全性。