class Concurrent::MutexAtomicReference

@!macro internal_implementation_note
@!visibility private

def _compare_and_set(old_value, new_value)

@!macro atomic_reference_method_compare_and_set
def _compare_and_set(old_value, new_value)
  synchronize do
    if @value.equal? old_value
      @value = new_value
      true
    else
      false
    end
  end
end

def get

@!macro atomic_reference_method_get
def get
  synchronize { @value }
end

def get_and_set(new_value)

@!macro atomic_reference_method_get_and_set
def get_and_set(new_value)
  synchronize do
    old_value = @value
    @value = new_value
    old_value
  end
end

def initialize(value = nil)

@!macro atomic_reference_method_initialize
def initialize(value = nil)
  super()
  @Lock = ::Mutex.new
  @value = value
end

def set(new_value)

@!macro atomic_reference_method_set
def set(new_value)
  synchronize { @value = new_value }
end

def synchronize

@!visibility private
def synchronize
  if @Lock.owned?
    yield
  else
    @Lock.synchronize { yield }
  end
end