package edu.vandy.common;
import java.util.concurrent.atomic.AtomicInteger;
/**
* A simple reference counter that can be used to close down objects
* when they are no longer needed, e.g., to control the lifecycle of
* singletones.
*/
public abstract class RefCounted {
/**
* Debugging tag used by the Android logger.
*/
protected final String TAG =
getClass().getSimpleName();
/**
* Ensure atomic increments and decrements of the reference count.
*/
protected final AtomicInteger mRefcount =
new AtomicInteger();
/**
* Return the current reference count.
*/
public int getRefcount() {
return mRefcount.get();
}
/**
* Atomically increment the reference count by one.
*/
public final RefCounted incrementRefCount() {
mRefcount.incrementAndGet();
return this;
}
/**
* Atomically decrement the reference count by one and calls the
* close() hook method on the object so it can clean itself up.
*/
public int decrementRefCount() {
int count = mRefcount.decrementAndGet();
if (count == 0)
close();
return count;
}
/**
* Hook method that closes the object being reference counted.
*/
protected abstract void close();
}