Class ConcurrentUtils

java.lang.Object
io.servicetalk.concurrent.internal.ConcurrentUtils

public final class ConcurrentUtils extends Object
Utilities which can be used for concurrency.
  • Method Details

    • tryAcquireLock

      public static <T> boolean tryAcquireLock(AtomicIntegerFieldUpdater<T> lockUpdater, T owner)
      Acquire a lock that is exclusively held with no re-entry, but attempts to acquire the lock while it is held can be detected by releaseLock(AtomicIntegerFieldUpdater, Object).
      Type Parameters:
      T - The type of object that owns the lock.
      Parameters:
      lockUpdater - The AtomicIntegerFieldUpdater used to control the lock state.
      owner - The owner of the lock object.
      Returns:
      true if the lock was acquired, false otherwise.
    • releaseLock

      public static <T> boolean releaseLock(AtomicIntegerFieldUpdater<T> lockUpdater, T owner)
      Release a lock that was previously acquired via tryAcquireLock(AtomicIntegerFieldUpdater, Object).
      Type Parameters:
      T - The type of object that owns the lock.
      Parameters:
      lockUpdater - The AtomicIntegerFieldUpdater used to control the lock state.
      owner - The owner of the lock object.
      Returns:
      true if the lock was released, and no other attempts were made to acquire the lock while it was held. false if the lock was released but another attempt was made to acquire the lock before it was released.
    • tryAcquireReentrantLock

      public static <T> long tryAcquireReentrantLock(AtomicLongFieldUpdater<T> lockUpdater, T owner)
      Acquire a lock that allows reentry and attempts to acquire the lock while it is held can be detected by releaseReentrantLock(AtomicLongFieldUpdater, long, Object).

      This lock must eventually be released by the same thread that acquired the lock. If the thread that acquires this lock is terminated before releasing the lock state is undefined.

      Type Parameters:
      T - The type of object that owns the lock.
      Parameters:
      lockUpdater - The AtomicLongFieldUpdater used to control the lock state.
      owner - The owner of the lock object.
      Returns:
      0 if the acquire was unsuccessful, otherwise an identifier that must be passed to a subsequent call of releaseReentrantLock(AtomicLongFieldUpdater, long, Object).
    • releaseReentrantLock

      public static <T> boolean releaseReentrantLock(AtomicLongFieldUpdater<T> lockUpdater, long acquireId, T owner)
      Release a lock that was previously acquired via tryAcquireReentrantLock(AtomicLongFieldUpdater, Object).
      Type Parameters:
      T - The type of object that owns the lock.
      Parameters:
      lockUpdater - The AtomicLongFieldUpdater used to control the lock state.
      acquireId - The value returned from the previous call to tryAcquireReentrantLock(AtomicLongFieldUpdater, Object).
      owner - The owner of the lock object.
      Returns:
      true if the lock was released, or releases a prior re-entrant acquire, and no other attempts were made to acquire the lock while it was held. false if the lock was released but another attempt was made to acquire the lock before it was released.
    • calculateSourceRequested

      public static <T> long calculateSourceRequested(AtomicLongFieldUpdater<T> requestNUpdater, AtomicLongFieldUpdater<T> sourceRequestedUpdater, AtomicLongFieldUpdater<T> emittedUpdater, int limit, T owner)
      Attempts to increment sourceRequestedUpdater in order to make it the same as requestNUpdater while not exceeding the limit. Note that the return value maybe larger than limit if there is "stolen" demand (e.g. emitting > sourceRequested). In this case the assumed peer sources have requested signals, and instead the signals were delivered to the local source.
      Type Parameters:
      T - The type of object which owns the atomic updater parameters.
      Parameters:
      requestNUpdater - The total number which has been requested (typically from PublisherSource.Subscription.request(long)).
      sourceRequestedUpdater - The total number which has actually been passed to PublisherSource.Subscription.request(long). This outstanding count sourceRequestedUpdater - emittedUpdater should not exceed limit unless there are peer sources which may result in "unsolicited" emissions.
      emittedUpdater - The amount of data that has been emitted/delivered by the source.
      limit - The maximum outstanding demand from the source at any given time.
      owner - The object which all atomic updater parameters are associated with.
      Returns:
      The amount which sourceRequestedUpdater was increased plus any "stolen" demand. This value is typically used for upstream PublisherSource.Subscription.request(long) calls.