code: def lock(&block)
        raise ThreadError, 'Attempt to lock a mutex which is already locked by this thread' if owned?
        if block_given?
          lock
          begin
            yield
          ensure
            unlock
          end
        else
          @mutex.synchronize do
            @condition_variable.wait(@mutex) if locked?
            @owner = caller
          end
          nil
        end
      end
docs: Creates a new {Mutex} concurrency tool.
   @return [Mutex]
   @raise [ThreadError] if current thread is already locking it
  @overload lock
    Obtains the lock or sleeps the current thread until it is available.
    @return [void]
  @overload lock(&block)
    Obtains the lock, runs the block, then releases the lock when the block completes.
    @raise [Exception] any exception raised in block
    @yield block to run while holding the lock
    @return [Object] result of the block