Interface Retainable
- All Known Subinterfaces:
Content.Chunk
,RetainableByteBuffer
- All Known Implementing Classes:
AbstractRetainableByteBuffer
,ArrayByteBufferPool.Tracking.Buffer
,ByteBufferChunk
,ByteBufferChunk.ReleasedByConsumer
,ByteBufferChunk.ReleasedByRunnable
,ByteBufferChunk.WithReferenceCount
,ByteBufferChunk.WithRetainable
,NonRetainableByteBuffer
,Retainable.ReferenceCounter
,Retainable.Wrapper
,RetainableByteBuffer.Wrapper
,Stream.Data
,Stream.Data
,Trailers
A reference counted resource, for example one that is borrowed from a pool, that may be retained an additional number of times, and released a correspondent number of times, over its lifecycle.
The resource is typically implicitly retained when it is first created. It may be retained more times (thus incrementing its reference count) and released (thus decrementing its reference count), until the reference count goes to zero.
Idiomatic usage
The general rules to use Retainable
objects are the following:
- If the
Retainable
has been obtained by calling a method, and the caller code consumes it, then the caller code must callrelease()
. - If the
Retainable
has been obtained bycaller2
by calling a method, andcaller2
returns it without consuming it tocaller1
, thencaller2
must not callrelease()
, sincecaller1
will. - If the
Retainable
has been obtained as a method argument, the receiver code must either:- Consume the
Retainable
synchronously within the method, in which caserelease()
must not be called. - Pass the
Retainable
to some other method, in which caserelease()
must not be called. - Store away the
Retainable
for later or asynchronous processing, for example storing it in containers such asCollection
s, or capturing it in a lambda that is passed to another thread, etc., in which caseretain()
must be called and a mechanism to callrelease()
later or asynchronously for this additionalretain()
must be arranged.
- Consume the
-
Nested Class Summary
Modifier and TypeInterfaceDescriptionstatic class
A reference count implementation for aRetainable
resource.static class
A wrapper ofRetainable
instances. -
Method Summary
-
Method Details
-
canRetain
default boolean canRetain()Returns whether this resource is referenced counted by calls to
retain()
andrelease()
.Implementations may decide that special resources are not not referenced counted (for example,
static
constants) so callingretain()
is a no-operation, and callingrelease()
on those special resources is a no-operation that always returns true.- Returns:
- true if calls to
retain()
are reference counted.
-
retain
default void retain()Retains this resource, potentially incrementing a reference count if there are resources that will be released.
-
release
default boolean release()Releases this resource, potentially decrementing a reference count (if any).
- Returns:
true
when the reference count goes to zero or if there was no reference count,false
otherwise.
-