code: def lock(&block)
        if block_given?  
          lock
          start_depth = @lock_depth
          begin
            yield
          ensure
            ensure_can_unlock
            unless @lock_depth == start_depth
              raise ThreadError, 'Attempt to unlock a ReentrantMutex whose lock depth has been changed since locking it'
            end
            unlock
          end
        else
          super unless owned?
          @lock_depth += 1
          nil
        end
      end
docs: Creates a new {ReentrantMutex} concurrency tool.
   @return [ReentrantMutex]
  @overload lock
    Obtains a lock, blocking until available.
    It will acquire a lock even if one is already held.
    @return [void]
  @overload lock(&block)
    Obtains a lock, runs the block, then releases a lock.
    It will block until a lock is available.
    It will acquire a lock even if one is already held.
    @raise [ThreadError] if not locked by the calling thread when unlocking
    @raise [ThreadError] if not holding the same lock count when unlocking
    @raise [Exception] any exception raised in block
    @yield block to run with the lock
    @return [Object] result of the block