📅  最后修改于: 2023-12-03 14:42:43.875000             🧑  作者: Mango
Java中的 AtomicInteger
类提供了一种线程安全的方式来操作整数。其中的 weakCompareAndSet()
方法用于进行无锁的原子性比较和交换操作。
public final boolean weakCompareAndSet(int expect, int update)
其中,expect
表示期望的值,update
表示要更新的值。
weakCompareAndSet()
方法使用弱一致性的比较和交换操作进行原子性操作。它在内部使用了 CPU 提供的 Compare And Swap(CAS) 指令,尝试使用期望的值将对象的值原子性地设置为新值。
如果当前值等于期望的值,则使用 update
更新值,并返回 true
,表示操作成功。否则,不进行更新,返回 false
。
值得注意的是,该方法是非阻塞的,即如果当前值不等于期望的值,则直接返回 false。因此,如果要保证更新成功,需要通过循环调用来实现。
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerDemo {
private static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
boolean flag = false;
while (!flag) {
int expect = count.get();
int update = expect + 1;
flag = count.weakCompareAndSet(expect, update);
}
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
boolean flag = false;
while (!flag) {
int expect = count.get();
int update = expect + 1;
flag = count.weakCompareAndSet(expect, update);
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count: " + count.get());
}
}
上述示例中,模拟了两个线程对 count
值做累加操作。通过 weakCompareAndSet()
方法保证了线程安全和数据一致性,最终输出 20000
,符合预期结果。
weakCompareAndSet()
方法是 AtomicInteger
类中常用的方法之一,通过它可以进行多线程安全的原子性操作。但需要注意的是,该方法是非阻塞的,需要通过循环调用来保证操作的正确性。实际使用时,需要结合具体的场景,合理使用该方法,以提高多线程编程的效率和安全性。