The object used to lock is not redundant. The object acts as a token, which is used to implement a simple synchronization protocol: everyone who has a lock is granted access to the blocked code. Everyone else must wait until the lock is released.
Without an object, it would be impossible to have different tokens, and all synchronization would rely on one internal token. That would not be very effective.
source share