Thread safety becomes a concern if there is at least a single entry point which can be accessed by multiple threads.
If a piece of code is accessed by multiple threads and is calling other method/class/etc., then all this code tree becomes vulnerable.
From "Java concurrency in practice":
The ﬁrst step in organizing a program around task execution is identifying sensible task boundaries. Ideally, tasks are independent activities: work that doesn’t
depend on the state, result, or side effects of other tasks. Independence facilitates concurrency, as independent tasks can be executed in parallel if there are
adequate processing resources.
For example, if you are writing an isolated servlet, which is guaranteed to be executed by a single thread, you don't have to worry. But if you write a static utility which is used by different servlets, then it has to be made to handle multi-threaded access.