Description
I found unsafe synchonrization in ObjID.java as follow:
private static class NumberGenerator {
static long numCounter = 65536;
...
synchronized long nextLong()
...
}
numCounter is a static class field. querySerialNumber increment (non-atomic) operation is in a synchronized method which means it is protected by "this".
Consequence:
Different object instances will synchronize on different "this", numCounter increment is not protected by a uniform lock. It results in race condition in numCounter increment, thus having incorrect numCounter value.
It would be more proper to write the code as follows:
private static class NumberGenerator {
static long numCounter = 65536;
private static final Object monitor = new Object()
...
long nextLong() {
synchornized(monitor)
}
...
}