Because code executing on another Thread may have been creating the instance while this Thread was waiting for the lock in order to enter the synchronized block.

That said, your code looks rather old. In early Java versions, this kind of coding was considered optimal because a null check was more than an order of magnitude faster than obtaining a lock. With improvements in both computers and the JVM, the whole method would probably be synchronized. If at all anyone is still using the Singleton (anti-) pattern.