// A FlexibleVarContext is thread-safe AFTER the first variable has been defined // or after you call makeThreadSafe(), whichever comes first sclass FlexibleVarContext > VarContext { MapSO vars; *() {} *(VarContext parent) { super(parent); } O get(S name) { if (containsKey(vars, name)) ret mapGet(vars, name); if (parent != null) ret parent.get(name); null; } void set(S name, O value) { vars = putOrCreateSyncMap(vars, name, value); } AutoCloseable tempSet(S name, O value) { initMap(); ret main tempPut(vars, name, value); } void unset(S name) { remove(vars, name); } MapSO varMap() { ret vars; } void makeThreadSafe aka initMap() { vars if null = syncHashMap(); } }