ZetCode

Java AtomicLong

最后修改于 2025 年 5 月 25 日

在本文中,我们将使用 Java 的 AtomicLong

AtomicLong 提供了一个可以原子读取和写入的 long 变量。它确保对变量的操作是线程安全的,从而防止并发环境中出现诸如丢失更新之类的问题。

AtomicLong 是 java.util.concurrent.atomic 包中的一个类,它提供了一种原子且线程安全的方式来表示和操作 long 原始数据类型。

AtomicLong 是一种同步原语。它为 long 值提供原子操作,确保线程安全地访问和修改。与传统的锁(可能会引入性能开销)不同,AtomicLong 利用底层原子指令来维护数据一致性,而无需阻塞线程。它的主要目的是高效地处理并发更新,同时避免竞争条件。

主要特点

使用 AtomicLong 的好处

AtomicLong 的用例

计数器示例

在下一个示例中,我们生成 500 个线程。每个线程都会递增一个计数器。

Main.java
class Counter {

    private final AtomicLong counter = new AtomicLong(0);

    public void inc() {

        counter.getAndIncrement();
    }

    public long get() {

        return counter.get();
    }
}


void main() throws InterruptedException {

    final Counter counter = new Counter();

    // 500 threads
    for (int i = 0; i < 500; i++){

        var thread = new Thread(counter::inc);

        thread.start();
    }

    // sleep three seconds
    Thread.sleep(3000);

    System.out.println("Value: " + counter.get());
}

最后,计数器应该是 500。

private final AtomicLong counter = new AtomicLong(0);

计数器是一个初始化为 0 的 AtomicLong

public void inc() {

    counter.getAndIncrement();
}

inc 方法安全地递增计数器。

public long get() {

    return counter.get();
}

get 方法返回计数器的当前值。

来源

Java AtomicLong - 语言参考

在本文中,我们使用了 Java 中的 AtomicLong

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有Java教程