but in KB BOOK it written: Text in bold
Threads calling non-static synchronized methods in the same class will
only block each other if they're invoked using the same instance. That's
because they each lock on this instance, and if they're called using two different
instances, they get two locks, which do not interfere with each other
As you say, the threads aren't interfering because they are locking on different objects. Which means there's very little you can guarantee about the order things happen in. The output you've given is just one of many possible outputs.
So what is your question ? The ordering will not be guaranteed because the synchronization is done on separate objects as noticed by Matthew. Try synchronizing on the same object instance if you would like to see ordered output.
As an added question, how many possible outputs exist if the threads lock on the same object ? Figuring that out will help you at the exam and at work.