What do you mean by StringBuilder is not a thread safe ?
Hello Developers ๐งโ๐ป, I have been asking this question in interviews most of the time, and I get disappointed by candidates.
Everyone knows StringBuilder helps in creating mutable string objects because a normal String object is immutable. But when it comes to answering more about StringBuilder, the candidate just says StringBuilder is non-synchronized
. However, when I ask them to give a simple example proving that StringBuilder is non-synchronized, they lack practical understanding.
Why is StringBuilder Non-Synchronized?
The non-synchronized nature of StringBuilder
is by design, to improve performance in single-threaded environments. Synchronization introduces overhead, and in scenarios where thread safety is not a concern, StringBuilder
offers a more efficient option for string manipulation.
Practical Example: The Race Condition
Here's a code example demonstrating a potential issue if you use StringBuilder in a multithreaded environment without proper synchronization:
We create a
StringBuilder
objectsb
.Three threads are created:
t1
appends "A" tosb
1000 times.t2
appends "B" tosb
1000 times.
Both threads start executing concurrently.
Since StringBuilder is non-synchronized, there's no guarantee about the order in which characters are appended. In a perfect scenario, the final string would be "AAABBBBAAAABBBBAAA..." (2,000 characters alternating A and B).
However, due to the race condition, the order might be interleaved, resulting in an unexpected output like "ABABABABABABABABABAB...".
Key Takeaways:
StringBuilder is ideal for efficient string manipulation in single-threaded environments.
Its non-synchronized nature makes it unsuitable for multithreaded scenarios without proper synchronization mechanisms (like synchronized blocks or concurrent collections).
For thread safety in multithreaded environments, consider using
StringBuffer
(though it's slightly less performant).
Conclusion
When StringBuilder
is used in a multi-threaded environment without proper synchronization, it can lead to incorrect results. If thread safety is a concern, consider using StringBuffer
or synchronizing the access to the StringBuilder
instance externally.
Subscribe to my newsletter
Read articles from Sudarshan Doiphode directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Sudarshan Doiphode
Sudarshan Doiphode
๐ Hey there! I'm Sudarshan, a tech enthusiast with a focus on: โข ๐ Spring Boot โข ๐ผ Spring โข ๐ Spring Security โข ๐ฑ Hibernate โข โ Java 8 & Java โข ๐ Apache Kafka โข ๐ข๏ธ Apache Maven โข ๐ณ Docker โข ๐ Git โข ๐๏ธ Design Patterns โข And more tech adventures! Follow for insights and join the journey. ๐๐จโ๐ป #TechEnthusiast