Class RefImpl<T>

  • Type Parameters:
    T -
    All Implemented Interfaces:
    AutoCloseable, Ref<T>

    public class RefImpl<T>
    extends Object
    implements Ref<T>
    Implementation of a Ref TODO Avoid needless synchronization; a ConcurrentHashMap may help; ref.equals could do only reference comparison
    Author:
    raven
    • Field Detail

      • traceAcquisitions

        protected boolean traceAcquisitions
      • value

        protected T value
      • releaseAction

        protected AutoCloseable releaseAction
        The release action is run once immediately when the isAlive() state changes to false. The release action cannot 'revive' a reference as the reference is already 'dead'. The release action differs depending on how a reference was created: On the root reference, the releaseAction releases the wrapped resource On a child reference, the releaseAction releases itself (the child) from the parent one.
      • synchronizer

        protected Object synchronizer
        Object on which to synchronize on before any change of state of this reference. This allows for e.g. synchronizing on a Map<K, Reference<V>, such that closing a reference removes the map entry before it can be accessed and conversely, synchronizing on the map prevents the reference from becoming released. TODO Point to the ClaimingLoadingCache implementation
      • comment

        protected Object comment
      • isClosed

        protected volatile boolean isClosed
      • activeChildRefs

        protected volatile int activeChildRefs
    • Method Detail

      • getComment

        public Object getComment()
      • getSynchronizer

        public Object getSynchronizer()
        Description copied from interface: Ref
        Return the object on which reference acquisition, release and the close action are synchronized on.
        Specified by:
        getSynchronizer in interface Ref<T>
      • get

        public T get()
        Description copied from interface: Ref
        Get the referent only iff this ref instance has not yet been closed. This method fails for closed alive refs. A closed reference is alive if it has unclosed child references. For most use cases the referent should be accessed using this method.
        Specified by:
        get in interface Ref<T>
        Returns:
        The referent
      • acquire

        public Ref<T> acquire​(Object comment)
        Description copied from interface: Ref
        Acquire a new reference with a given comment object Acquiration fails if isAlive() returns false
        Specified by:
        acquire in interface Ref<T>
        Returns:
      • release

        protected void release​(Object childRef)
      • isAlive

        public boolean isAlive()
        Description copied from interface: Ref
        A reference may itself be closed, but references to it may keep it alive
        Specified by:
        isAlive in interface Ref<T>
        Returns:
        true iff either this reference is not closed or there exists any acquired reference.
      • checkRelease

        protected void checkRelease()
      • fromCloseable

        public static <T extends AutoCloseableRef<T> fromCloseable​(T value,
                                                                     Object synchronizer)
      • create2

        public static <T> Ref<T> create2​(T value,
                                         Object synchronizer,
                                         java.util.function.Consumer<? super T> closer)
        Create method where the close action is created from a provided lambda that accepts the value
      • createClosed

        public static <T> Ref<T> createClosed()
      • isClosed

        public boolean isClosed()
        Description copied from interface: Ref
        Check whether this reference is closed
        Specified by:
        isClosed in interface Ref<T>
      • getRootRef

        public Ref<T> getRootRef()
        Description copied from interface: Ref
        Get the root reference
        Specified by:
        getRootRef in interface Ref<T>
      • getAcquisitionStackTrace

        public StackTraceElement[] getAcquisitionStackTrace()
        Description copied from interface: Ref
        Optional operation. References may expose where they were acquired
        Specified by:
        getAcquisitionStackTrace in interface Ref<T>
        Returns: