Course Content
Multithreading in Java
Multithreading in Java
Atomicity
Incremental and Atomicity
In this code, we define a Counter
class with a count
variable and an increment method that increases the value of the count
variable by 1.
Main
public class Counter { int count; // Declare a variable public void increment() { // In this method we increment count++; } }
It may seem like incrementing is a single operation, but it is actually composed of 3 operations:
But at the machine code level, these are several operations:
1. Reading the count
value;
2. Increasing the value by 1;
3. Writing the new value back to count
.
Note
If multiple threads perform this operation simultaneously without synchronization, the result might be incorrect because one thread might start incrementing while another thread is still writing the increment result to memory. This issue is known as race conditions.
How to Avoid Atomicity Violations?
The following approaches can address atomicity issues in multithreaded programming in Java:
Using synchronization: Synchronization controls access to shared resources by using the synchronized keyword, which can be applied to methods or code blocks.
Using atomic classes: Java's java.util.concurrent.atomic
package offers classes for atomic operations. These classes use low-level synchronization mechanisms, like CAS (Compare-And-Swap), to ensure atomicity without locks. (We will explore these classes in more detail later)
Use of high-level classes and collections: Java provides high-level synchronized data structures such as ConcurrentHashMap
and CopyOnWriteArrayList
that offer safe access from multiple threads. (We will review these classes in more detail later)
Thanks for your feedback!