Java AtomicLong tutorial explores how to use AtomicLong for thread-safe manipulation of long values in concurrent applications. Learn about atomic operations, synchronization techniques, and best practices for multithreading in Java.
last modified May 25, 2025
In this article, we work with Java’s AtomicLong.
AtomicLong provides a long variable that can be read and written atomically. It ensures that operations on the variable are thread-safe, preventing issues like lost updates in concurrent environments.
AtomicLong is a class within the java.util.concurrent.atomic package that provides an atomic and thread-safe way to represent and manipulate a long primitive data type.
AtomicLong is a synchronization primitive. It provides atomic operations for long values, ensuring thread-safe access and modification. Unlike traditional locks, which can introduce performance overhead, AtomicLong leverages low-level atomic instructions to maintain data consistency without blocking threads. Its primary purpose is to handle concurrent updates efficiently while avoiding race conditions.
Key characteristics:
*Atomic operations:* AtomicLong guarantees that read
and write operations on the underlying long value are atomic. This means
each operation executes as a single, indivisible unit, even if multiple
threads are trying to access the value concurrently. This prevents
inconsistencies and data races that can occur with regular long
variables in a multithreaded environment.
*Thread-safety:* By ensuring atomic operations,
AtomicLong makes it safe to use the same long value across
multiple threads without requiring explicit synchronization mechanisms
like locks. This simplifies thread-safe programming and reduces the risk
of concurrency issues.
*Common operations:* The class provides various methods for
atomically performing operations on the long value, such as retrieving
the current value, setting a new value, incrementing or decrementing the
value, and performing compare-and-swap operations.
Benefits of using AtomicLong:
*Prevents data races:* Guaranteeing atomic operations avoids
inconsistencies that can arise when multiple threads try to read or
write the same long value simultaneously.
*Simplifies concurrent programming:* Eliminates the need for
complex synchronization code in scenarios where multiple threads access
a long variable.
*Improved performance:* Atomic operations can be more efficient
than using locks, particularly for frequently accessed variables.
Use cases for AtomicLong:
*Counters:* AtomicLong is ideal for representing
counters that are incremented or decremented by multiple threads in a
concurrent environment, such as tracking website visitors or active
network connections.
*Sequence numbers:* It can be used to generate unique and
atomically incremented sequence numbers, useful for purposes like
logging or transaction IDs.
*State flags:* AtomicLong can serve as a simple flag
variable that multiple threads can set or reset atomically, indicating a
specific state or condition.
In the next example, we generate 500 threads. Each thread increments a counter.
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());
}
In the end, the counter should be 500.
private final AtomicLong counter = new AtomicLong(0);
The counter is an AtomicLong initiated to 0.
public void inc() {
counter.getAndIncrement();
}
The inc method increments the counters safely.
public long get() {
return counter.get();
}
The get method returns the current value of the counter.
Java AtomicLong - language reference
In this article we have worked with AtomicLong in Java.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Java tutorials.