All changes made in one synchronized
method or block are atomic and visible with respect to other
synchronized methods and blocks employing the same lock, and
processing of synchronized methods or blocks within any given thread
is in program-specified order. Even though processing of statements
within blocks may be out of order, this cannot matter to other
threads employing synchronization.