I disagree with the fact that the code undermines the notion of word synchronized. The code written i think is correct and i will not have inconsistent value.
Each thread has its own working memory. variable 'i; in this case is the shared memory. When ever a thread sees synchrnoized it locks the object. then it loads the value of the variable from the shared memory to its working memory. The object is locked for wrting the manipulated value from the thread working memory to the shared memory. Till this transition happens no other thread will be able to write to shared memory. however other threads are still able to read the values.