user manual code example race condition
Vibhu Mohindra
vibhu.mohindra at gmail.com
Mon Mar 11 12:57:48 UTC 2019
[Note: I'm still on abcl-1.4.0, which is what I refer to here.]
The original poster is right. And so, I always have to remember to write:
Interpreter.createInstance();
Interpreter interp = Interpreter.getInstance();
but OP's solution is faster.
Here is why there is a race. Interpreter.java looks like this:
public static synchronized Interpreter getInstance() {
return interpreter;
}
public static synchronized Interpreter createInstance() {
if (interpreter != null)
return null;
interpreter = new Interpreter();
...
return interpreter;
}
OP's user code is:
Interpreter interpreter = Interpreter.getInstance ();
if ( interpreter == null ) {
interpreter = Interpreter.createInstance ();
}
which is not itself surrounded by a
synchronized (Interpreter.class) {...}
block.
So two threads T1, T2 executing it could be scheduled in two possible ways,
(where line execution is denoted by <thread, line_number>):
Schedule 1
<T1,1>, <T1,2>, <T2,1>, <T2,2>, <T2,3>, <T1,3>
resulting in this
T1:interpreter = null (due to Interpreter.createInstance()'s line 2):
T2:interpreter = <not null>
Schedule 2
<T1,1>, <T1,2>, <T1,3>, <T2,1>, <T2,2>, <T2,3>
resulting in:
T1:interpreter = <not null>
T2:interpreter = <not null>
More information about the armedbear-devel
mailing list