Monitor is a synchronization construct that allows threads to have both
thread-safe access to underlying monitored object or value (hereinafter
monitored entity) and wait for it to mutate (if it is a mutable object) or
change (if it is an immutable value) to a desirable state.