AtomicInteger
类的概念
AtomicInteger
是Java中的一个原子操作类,它提供了一种在多线程环境下对整数进行原子操作的方式。AtomicInteger
内部使用了CAS(Compare - And - Swap)算法来实现原子操作,保证了操作的原子性和可见性。
AtomicInteger
提供的原子操作方法
get()
和set(int newValue)
get()
方法用于获取AtomicInteger
对象的当前值。set(int newValue)
方法用于设置AtomicInteger
对象的新值。
incrementAndGet()
和decrementAndGet()
incrementAndGet()
方法用于对AtomicInteger
对象的值进行自增1操作,并返回自增后的值。decrementAndGet()
方法用于对AtomicInteger
对象的值进行自减1操作,并返回自减后的值。
addAndGet(int delta)
和getAndAdd(int delta)
addAndGet(int delta)
方法用于对AtomicInteger
对象的值加上一个指定的增量(delta
),并返回加上增量后的值。getAndAdd(int delta)
方法用于获取AtomicInteger
对象的当前值,然后对该值加上一个指定的增量(delta
),并返回加上增量前的值。
compareAndSet(int expect, int update)
compareAndSet(int expect, int update)
方法用于比较AtomicInteger
对象的当前值与期望值(expect
),如果相等,则将值更新为指定的新值(update
),并返回操作是否成功;如果不相等,则不进行任何操作,并返回操作失败。
使用AtomicInteger
实现线程安全的计数器
以下是一个使用AtomicInteger
实现线程安全计数器的示例代码:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
public static void main(String[] args) {
AtomicCounter counter = new AtomicCounter();
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final count: " + counter.getCount());
}
}
在这个示例中,我们创建了一个AtomicCounter
类,它使用AtomicInteger
来存储计数器的值。increment()
方法使用incrementAndGet()
方法对计数器进行自增操作,这个操作是原子性的,因此可以保证在多线程环境下计数器的正确性。在main
方法中,我们创建了两个线程来并发地对计数器进行自增操作,最后通过join()
方法等待两个线程执行完毕,并输出最终的计数值。
总结
AtomicInteger
类提供了一系列原子操作方法,可以方便地在多线程环境下实现线程安全的整数操作。通过使用AtomicInteger
类提供的原子操作方法,可以避免使用锁带来的性能开销,并且可以保证操作的原子性和可见性。