If the prints are shown "correctly", is because there are not much threads. Try to create 100 threads and you will see that prints are not shown sorted. If c in SynchronizedCounter is static, you can see race condition, since the threads are reading the same variable.