在Java多线程编程中,原子操作是指不可被中断的一个或一系列操作。这些操作在执行过程中不会被其他线程干扰,从而确保数据的一致性和安全性。Java提供了java.util.concurrent.atomic
包来支持原子操作。以下是一些常用的原子类和它们的用法:
AtomicInteger
:用于原子操作的整数。常用方法有getAndIncrement()
、getAndDecrement()
、compareAndSet()
等。import java.util.concurrent.atomic.AtomicInteger;
public class AtomicDemo {
private static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Runnable runnable = () -> {
for (int i = 0; i < 1000; i++) {
counter.getAndIncrement();
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Counter: " + counter.get()); // 输出:Counter: 2000
}
}
AtomicLong
:用于原子操作的长整数。常用方法与AtomicInteger
类似。
AtomicBoolean
:用于原子操作的布尔值。常用方法有getAndSet()
、compareAndSet()
等。
AtomicReference
:用于原子操作的引用类型。常用方法有getAndSet()
、compareAndSet()
等。
AtomicIntegerFieldUpdater
、AtomicLongFieldUpdater
、AtomicReferenceFieldUpdater
:这些类用于原子操作类的字段。它们需要一个目标对象和字段名作为参数,并提供原子更新指定字段的方法。
LongAdder
和 DoubleAdder
:这些类适用于高并发场景下的累加操作。它们的性能比AtomicLong
和AtomicDouble
更好,因为它们将累加操作分散到多个单元中,减少了线程竞争。
import java.util.concurrent.atomic.LongAdder;
public class LongAdderDemo {
private static LongAdder counter = new LongAdder();
public static void main(String[] args) throws InterruptedException {
Runnable runnable = () -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Counter: " + counter.sum()); // 输出:Counter: 2000
}
}
使用这些原子类和方法,可以确保在多线程环境下进行安全的原子操作。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。