        // An object that may be free or occupied.
abstract class Lockable {
    public void lock(){
        setFree(false);
    }

    public void release(){
        setFree(true);
    }

    public boolean isFree(){
        return free;
    }

    protected void setFree(boolean f) throws RuntimeException {
        if(free != f){
            // This is a change of state.
            free = f;
        }
        else{
            throw new RuntimeException("Lock was already set to: "+free);
        }
    }

    // Whether this is free or not.
    private boolean free = true;
}
