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
  • synchronized provides mutual exclusion and visibility.
  • volatile does not make compound read-modify-write operations atomic.
  • The Java Memory Model defines visibility guarantees.