when you synchronize your block, you have chosen the critical code for the locking(performance improvement) and you can choose locking object. [Lets say you have multiple object performing important action e.g book available seat and you have multiple request for booking. You might not allow everyone to book at same time nor you want to lock on this(current object). In this scenario you need to have common object to take lock and perform operation. At a time, Lock can be acquired by any one object. Thus, you guarantee only one requester book ticket at a time. Hence, no duplicate booking allowed].