Class SingleWaiterCooperativeNotifier

  • All Implemented Interfaces:
    Notifier

    public class SingleWaiterCooperativeNotifier
    extends SingleWaiterMultiNotifier
    SingleWaiterCooperativeNotifier is an extension of the SingleWaiterMultiNotifier which attempts to offload potentially expensive "notification" work from signaling threads onto the waiting threads. This notifier is beneficial when there are few signaling threads, but potentially many waiting threads, each waiting on their own notifier.

    Unlike the standard Notifier usage, a signaling thread must at some point invoke the static flush() method, or await(long) on any SingleWaiterCooperativeNotifier to ensure that all deferred signals are processed.

    Author:
    mf 2014.03.12
    • Field Detail

      • m_threadAwait

        protected Thread m_threadAwait
        The waiting thread, or null. Visibility ensured via super.m_oState writes.
      • s_cSignal

        protected static byte s_cSignal
        An intentionally non-volatile signal counter to ensure periodic flushes. byte is used to allow for auto-flush on every 256 signals (rollover)
    • Constructor Detail

      • SingleWaiterCooperativeNotifier

        public SingleWaiterCooperativeNotifier()
    • Method Detail

      • flush

        public static void flush()
        Ensure that any deferred signals will be processed.

        Note it is more advantageous if the calling thread's natural idle point is to sit in await(long), in which case calling this method is not required.

      • await

        public void await​(long cMillis)
                   throws InterruptedException
        Description copied from interface: Notifier
        Wait for a notification. Note that spurious wake-ups are possible.
        Specified by:
        await in interface Notifier
        Overrides:
        await in class SingleWaiterMultiNotifier
        Parameters:
        cMillis - the maximum wait time in milliseconds, or zero for indefinite
        Throws:
        InterruptedException - if the calling thread is interrupted while it is waiting
      • flush

        protected static void flush​(int cWake,
                                    SingleWaiterCooperativeNotifier self)
        Ensure that any deferred signals will be processed.
        Parameters:
        cWake - the number of deferrals to signal on the calling thread
        self - the waiting notifier which is flushing, or null