lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb
require 'concurrent/synchronization/full_memory_barrier'
module Concurrent
module Synchronization
# @!visibility private
# @!macro internal_implementation_note
#
# By extending this module, a class and all its children are marked to be constructed safely. Meaning that
# all writes (ivar initializations) are made visible to all readers of newly constructed object. It ensures
# same behaviour as Java's final fields.
#
# Due to using Kernel#extend, the module is not included again if already present in the ancestors,
# which avoids extra overhead.
#
# @example
# class AClass < Concurrent::Synchronization::Object
# extend Concurrent::Synchronization::SafeInitialization
#
# def initialize
# @AFinalValue = 'value' # published safely, #foo will never return nil
# end
#
# def foo
# @AFinalValue
# end
# end
module SafeInitialization
def new(*args, &block)
super(*args, &block)
ensure
Concurrent::Synchronization.full_memory_barrier
end
end
end
end