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

📅  最后修改于: 2023-12-03 14:42:43.824000             🧑  作者: Mango

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

在多线程编程中,线程安全是至关重要的,特别是在涉及到共享变量的情况下。Java提供了一些原子性的操作类,包括AtomicIntegerAtomicLong等等。这些类提供了原子性的读取和写入,以及其他一些原子性的操作,从而保证多个线程对同一变量的操作是线程安全的。

AtomicInteger compareAndSet()方法

AtomicInteger类提供了一个名为compareAndSet(int expect, int update)的方法,该方法的作用是,当当前值与期望值相等时,将该值更新为新值。该方法会返回一个boolean类型的值,表示操作是否成功。

其方法签名如下:

public final boolean compareAndSet(int expect, int update)

其中,expect表示期望值,update表示新值。

该方法的执行过程如下:

  1. 判断当前值是否等于期望值。
  2. 如果相等,则将当前值更新为新值。
  3. 如果不相等,则当前值不变。

该方法的执行过程是原子性的,因此多个线程同时调用该方法时,能够确保操作的线程安全性。

示例

下面是一个示例,演示如何使用compareAndSet()方法。

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    public static void main(String[] args) {
        AtomicInteger counter = new AtomicInteger(0);

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                int oldValue = counter.get();
                int newValue = oldValue + 1;
                while (!counter.compareAndSet(oldValue, newValue)) {
                    oldValue = counter.get();
                    newValue = oldValue + 1;
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                int oldValue = counter.get();
                int newValue = oldValue + 1;
                while (!counter.compareAndSet(oldValue, newValue)) {
                    oldValue = counter.get();
                    newValue = oldValue + 1;
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        System.out.println("Counter = " + counter);
    }
}

在上面的示例中,我们创建了一个AtomicInteger对象,并使用两个线程同时对其进行操作。每次操作都是使用compareAndSet()方法来实现的。如果操作失败,我们会重复尝试,直到操作成功。

最后,输出的结果应该是“Counter = 20”,因为每个线程对计数器增加了10次。

结论

compareAndSet()方法是一个非常有用的方法,可以确保多个线程对同一变量的操作是线程安全的。在实际编程中,我们应该尽可能多地使用这个方法,以确保我们的程序是线程安全的。