package im.actor.runtime.function;
public class CountedReference<T extends Closable> {
private T value;
private int counter;
private boolean isReleased;
public CountedReference(T value) {
this.value = value;
this.isReleased = false;
this.counter = 1;
}
public T get() {
if (isReleased) {
throw new RuntimeException("Already Released!");
}
return value;
}
public synchronized CountedReference<T> acquire() {
if (isReleased) {
throw new RuntimeException("Already Released!");
}
counter++;
acquire(counter);
return this;
}
protected synchronized void acquire(int counter) {
}
public synchronized void release() {
counter--;
release(counter);
if (counter == 0) {
if (isReleased) {
throw new RuntimeException("Already Released!");
}
value.close();
value = null;
isReleased = true;
}
}
protected synchronized void release(int counter) {
}
}