When synchronizing the anon-static swimIn() method, the two threads are competing to execute swim() for the same Pool object, the first thread to enter the method will seize the lock of this Pool object and will only release it when it finishes executing swimIn(). That means any other thread has to wait for the lock to be released to be able to enter swimIn().