ReferenceCounted.java
package eu.javaexperience.resource;
import java.util.concurrent.atomic.AtomicInteger;
public abstract class ReferenceCounted<T> implements AutoCloseable
{
public ReferenceCounted(T subject, int refcount)
{
this.subject = subject;
this.refcount.set(refcount);
}
public T getSubject()
{
return subject;
}
protected T subject;
protected AtomicInteger refcount = new AtomicInteger(0);
protected abstract void onFree();
public int acquire()
{
return refcount.incrementAndGet();
}
public int release()
{
int ret = refcount.decrementAndGet();
if(ret <= 0)
{
onFree();
}
return ret;
}
@Override
public void close()
{
release();
}
}