You do not need to use volatile
inside of synchronized
, synchronized already guarantees the correct behavior for local caching of variables when used consistently (on every access).
volatile
works on primitive values, and can be a nice shortcut for atomic accesses to a primitive type. Note that the behavior of volatile has changed in JDK 5 from 1.4.
More information can be found here