This week's book giveaway is in the General Computing forum. We're giving away four copies of Arduino in Action and have Martin Evans, Joshua Noble, and Jordan Hochenbaum on-line! See this thread for details.
ThreadLocal's own get and initialValue methods are not synchronized. If the (sub) class you saw has them synchronized, there may be some additional code inside them that requires synchronization. Without seeing that code we won't be able to tell.
Each thread has its own value, true, but the get and initialValue method are both called on the one thread local object. That means that if the get and/or initialValue method accesses some of the state variables (other than the thread-to-value map), they still need synchronization.