Does a variable that is accessed by multiple threads, but only inside synchronized blocks, need the volatile modifier? If not, why?
No. When you work within a synchronized block, all cached variables are synchronized on access, since it creates a memory barrier.
For details, see this comparison (with discussion) of volatile to synchronized.