[SPARK-4721][CORE] Improve logic while first thread put block failed

1. make thread which wait old block info try one by one while the first thread which created that block failed.
2. use reentrantLock instead of this.syn{} in block info.
I think you can just do  `Map("PUT" -> waitNCondition, "DROP" -> wait1Condition, "GET" -> wait1Condition)` instead of using a mutable map.