package base_class; public abstract class EnableCleanSingle<T>{ protected volatile T object; private int updateCount; public synchronized T getObject() { if(object == null) { createObject(); updateCount++; } return object; } public void cleanObject(){ int old = updateCount; if(object != null) { synchronized(this) { if (updateCount == old) { object = null; } } } } public int getUpdateCount() { return updateCount; } abstract public T createObject(); }