synchronized, Locks, and Visibility
synchronized provides mutual exclusion and memory-visibility guarantees. ReentrantLock offers additional features such as timed acquisition.
private final Object lock = new Object();
private int count;
void increment() {
synchronized (lock) {
count++;
}
}
int getCount() {
synchronized (lock) {
return count;
}
}
A data race occurs when concurrent access includes a write without appropriate synchronization. The Java Memory Model defines happens-before relationships.
volatile provides visibility and ordering guarantees but does not make compound operations such as count++ atomic.
Key Takeaways
synchronizedprovides mutual exclusion and visibility.volatiledoes not make compound read-modify-write operations atomic.- The Java Memory Model defines visibility guarantees.