Question: From the Java memory model, we know that every thread has its own thread stack, and that local variables are placed in each thread's own thread stack.

And that *other* threads can't access these local variables.

So in which case should we synchronize on local variables?

Answer: 
There are two situations:

1. The local variable is of a primitive type like `int` or `double`.
2. The local variable is of a reference type like `ArrayList`.

In the first situation, you *can't* synchronize, as you can only synchronize on Objects (which are pointed to by reference-type variables).

In the second situation, it all depends on what the local variable points to. If it points to an object that other threads (can) also point to, then you need to make sure that your code is properly synchronized.

Examples: you assigned the local variable from a `static` or instance field, or you got the object from a shared collection.

If, however, the object was created in your thread and only assigned to that local variable, and you never give out a reference to it from your thread to another thread, and the objects implementation itself also doesn't give out references, then you don't need to worry about synchronization.
Yes, it does make sense when the local variable is used to synchronize access to a block of code from threads that are defined and created in the same method as the local variable.