WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Java Concurrency · Advanced · question 54 of 100

What is a memory barrier in Java and how does it affect multi-threaded code?

📕 Buy this interview preparation book: 100 Java Concurrency questions & answers — PDF + EPUB for $5

In Java, a memory barrier is a synchronization mechanism that enforces ordering constraints on memory operations. It ensures that memory accesses performed by a thread before the barrier are visible to other threads after the barrier. There are two types of memory barriers: acquire and release.

An acquire barrier ensures that all memory operations performed by a thread before the barrier are visible to other threads that execute the barrier after the acquiring thread. This means that if a thread reads a shared variable before an acquire barrier, it is guaranteed to see the latest value of that variable before any memory operation that follows the barrier.

A release barrier ensures that all memory operations performed by a thread after the barrier are visible to other threads that execute the barrier before the releasing thread. This means that if a thread writes a shared variable after a release barrier, it is guaranteed that the new value of that variable will be visible to other threads that read the variable after the barrier.

The volatile keyword in Java provides a type of memory barrier. When a variable is declared as volatile, all read and write operations on that variable have acquire and release semantics, respectively. This ensures that changes to the variable made by one thread are visible to other threads immediately.

Here’s an example of using a memory barrier in Java with the volatile keyword:

public class MemoryBarrierExample {
    private volatile int sharedVariable = 0;

    public void writerThread() {
        sharedVariable = 42; // write to shared variable
        // release barrier
    }

    public void readerThread() {
        // acquire barrier
        int localValue = sharedVariable; // read from shared variable
        // do something with localValue
    }
}

In this example, the writerThread writes a value to the sharedVariable and implicitly performs a release barrier. The readerThread reads the value of sharedVariable and implicitly performs an acquire barrier before the read operation. The use of the volatile keyword ensures that the read and write operations have acquire and release semantics, respectively.

Memory barriers are an important tool for ensuring correct behavior in multi-threaded applications. They help prevent issues such as race conditions, where the behavior of a program depends on the order of execution of concurrent threads.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Java Concurrency interview — then scores it.
📞 Practice Java Concurrency — free 15 min
📕 Buy this interview preparation book: 100 Java Concurrency questions & answers — PDF + EPUB for $5

All 100 Java Concurrency questions · All topics