📌  相关文章
📜  Java中用于无锁算法的 AtomicInteger(1)

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

Java中用于无锁算法的AtomicInteger

在多线程并发编程中,锁机制是实现同步访问共享资源的常用手段,但是使用锁会带来一定的性能开销,尤其是在高并发场景下,效率低下。此时,无锁算法成为了一种性能更高的选择。

Java中提供了AtomicInteger类用于实现无锁算法,本文将对其进行介绍和使用案例演示。

AtomicInteger介绍

AtomicInteger是Java中用于实现原子操作的一个类,它可以在不使用锁的情况下实现对变量的原子操作。

AtomicInteger提供了以下常用方法:

  • int get():获取当前值。
  • void set(int newValue):设置为newValue值。
  • int getAndSet(int newValue):获取当前值,并设置为newValue值。
  • boolean compareAndSet(int expect, int update):当当前值等于expect时,设置为update值,返回是否设置成功。
  • int getAndIncrement():获取当前值,并将其自增1。
  • int getAndDecrement():获取当前值,并将其自减1。
  • int incrementAndGet():将当前值自增1,返回自增后的值。
  • int decrementAndGet():将当前值自减1,返回自减后的值。
使用案例

下面通过一个简单的案例来演示AtomicInteger的用法。

假设有一个全局变量counter,多个线程需要对其进行自增操作,我们可以使用AtomicInteger来实现对counter的原子操作。

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicCounterExample {
    private static AtomicInteger counter = new AtomicInteger(0); // 初始化为0

    public static void main(String[] args) {
        // 创建10个线程对counter进行累加操作
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    counter.incrementAndGet(); // 自增操作
                }
            }).start();
        }

        // 等待所有线程完成
        try {
            Thread.sleep(1000); // 让主线程等待1秒,等待其他线程累加完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("累加后的结果为:" + counter.get()); // 获取累加后的结果
    }
}

上述代码创建了10个线程对counter进行自增操作,每个线程累加10000次。由于AtomicInteger的自增操作是原子的,所以我们可以得到正确的累加结果。

总结

Java中的AtomicInteger可以实现无锁算法,它提供了一系列原子操作方法,可以用于多线程并发编程中对变量的原子操作。

使用AtomicInteger可以实现高效的访问共享变量,降低锁带来的性能开销。但是由于需要额外的CAS操作,所以在低并发量的场景下,使用synchronized可能更为简单和高效。