public MachineState Lock(MachineId machineId, string userName)
        {
            lock (_lock)
            {
                if (string.IsNullOrEmpty(userName))
                {
                    throw new ArgumentException($"{nameof(userName)} is null or empty!");
                }

                if (!_stateDictionary.ContainsKey(machineId))
                {
                    Add(machineId);
                }

                MachineState state = _stateDictionary[machineId];
                if (state.IsLocked())
                {
                    throw new InvalidOperationException($"machine {machineId} has already ben locked!");
                }

                MachineState newState = MachineState.ForLocked(machineId, userName);
                _stateDictionary[machineId] = newState;
                return(newState);
            }
        }