avoid concurrency problem, 2 (EA-84206)

This commit is contained in:
Maxim.Mossienko
2016-06-15 12:48:54 +02:00
parent f7fbc4b4bc
commit e64d932eef
@@ -43,23 +43,37 @@ public class ID<K, V> {
final File indices = getEnumFile();
try {
final BufferedReader reader = new BufferedReader(new FileReader(indices));
TObjectIntHashMap<String> nameToIdRegistry = new TObjectIntHashMap<String>();
try {
int cnt = 0;
do {
cnt++;
final String name = reader.readLine();
if (name == null) break;
ourNameToIdRegistry.put(name, cnt);
nameToIdRegistry.put(name, cnt);
}
while (true);
}
finally {
reader.close();
}
synchronized (ourNameToIdRegistry) {
ourNameToIdRegistry.ensureCapacity(nameToIdRegistry.size());
nameToIdRegistry.forEachEntry(new TObjectIntProcedure<String>() {
@Override
public boolean execute(String name, int index) {
ourNameToIdRegistry.put(name, index);
return true;
}
});
}
}
catch (IOException e) {
ourNameToIdRegistry.clear();
writeEnumFile();
synchronized (ourNameToIdRegistry) {
ourNameToIdRegistry.clear();
writeEnumFile();
}
}
}
@@ -77,18 +91,18 @@ public class ID<K, V> {
}
private static short stringToId(String name) {
if (ourNameToIdRegistry.containsKey(name)) {
return (short)ourNameToIdRegistry.get(name);
synchronized (ourNameToIdRegistry) {
if (ourNameToIdRegistry.containsKey(name)) {
return (short)ourNameToIdRegistry.get(name);
}
int n = ourNameToIdRegistry.size() + 1;
assert n <= MAX_NUMBER_OF_INDICES : "Number of indices exceeded";
ourNameToIdRegistry.put(name, n);
writeEnumFile();
return (short)n;
}
int n = ourNameToIdRegistry.size() + 1;
assert n <= MAX_NUMBER_OF_INDICES : "Number of indices exceeded";
ourNameToIdRegistry.put(name, n);
writeEnumFile();
return (short)n;
}
private static void writeEnumFile() {