Is Your Spring MVC Controller Thread‑Safe? Understand and Fix It
This article explains what thread safety means, demonstrates how a simple counter can become unsafe under concurrent requests, shows Java code examples of the problem and its synchronized solution, and provides practical guidelines for ensuring Spring MVC controllers remain thread‑safe by avoiding shared mutable state or using synchronization mechanisms such as synchronized blocks or ThreadLocal.
Understanding Thread Safety in Spring MVC Controllers
Interviewers often ask whether a Spring MVC Controller is thread‑safe. Before answering, we need to understand what thread safety means.
What is thread safety?
Thread safety means that when multiple threads invoke a method simultaneously, the result is always the expected one, independent of the execution order.
Simple unsafe example
The following Java program simulates 100 concurrent threads incrementing a shared counter without synchronization, leading to duplicate and missing values.
import java.util.Random;
public class ThreadTest {
private int count;
@SneakyThrows
public int incCount() {
Thread.sleep(new Random().nextInt(500));
return count++;
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
for (int i = 0; i < 100; i++) {
new Thread(() -> System.out.println(threadTest.incCount())).start();
}
}
}Typical output shows numbers out of order and repeated values, e.g., 12 appears twice, and the final count may be 90 instead of the expected 99.
0
1
2
3
4
5
6
8
7
9
10
11
13
12
12
14
15
…
90Fixing the problem with synchronization
Adding the synchronized keyword forces each thread to acquire a lock before executing the method, guaranteeing correct results but reducing throughput.
@SneakyThrows
public synchronized int incCount() {
Thread.sleep(new Random().nextInt(500));
return count++;
}Implications for Spring MVC Controllers
Spring MVC Controllers are singletons, and each HTTP request is handled by a separate thread. If a controller holds mutable instance variables, concurrent requests can corrupt the data, making the controller effectively thread‑unsafe.
How to make Controllers thread‑safe
Avoid defining mutable fields in the controller whenever possible.
If shared state is required, protect it with synchronization mechanisms such as synchronized blocks.
For per‑request data, use ThreadLocal or method‑local variables to keep state isolated to each thread.
These practices ensure that the controller remains thread‑safe without sacrificing performance.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Java Backend Technology
Focus on Java-related technologies: SSM, Spring ecosystem, microservices, MySQL, MyCat, clustering, distributed systems, middleware, Linux, networking, multithreading. Occasionally cover DevOps tools like Jenkins, Nexus, Docker, and ELK. Also share technical insights from time to time, committed to Java full-stack development!
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
