📅  最后修改于: 2023-12-03 14:42:43.824000             🧑  作者: Mango
AtomicInteger compareAndSet()
方法及示例在多线程编程中,线程安全是至关重要的,特别是在涉及到共享变量的情况下。Java提供了一些原子性的操作类,包括AtomicInteger
,AtomicLong
等等。这些类提供了原子性的读取和写入,以及其他一些原子性的操作,从而保证多个线程对同一变量的操作是线程安全的。
AtomicInteger compareAndSet()
方法AtomicInteger
类提供了一个名为compareAndSet(int expect, int update)
的方法,该方法的作用是,当当前值与期望值相等时,将该值更新为新值。该方法会返回一个boolean
类型的值,表示操作是否成功。
其方法签名如下:
public final boolean compareAndSet(int expect, int update)
其中,expect
表示期望值,update
表示新值。
该方法的执行过程如下:
该方法的执行过程是原子性的,因此多个线程同时调用该方法时,能够确保操作的线程安全性。
下面是一个示例,演示如何使用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()
方法是一个非常有用的方法,可以确保多个线程对同一变量的操作是线程安全的。在实际编程中,我们应该尽可能多地使用这个方法,以确保我们的程序是线程安全的。