Java: volatile guarantees and out-of-order execution
Posted
by WizardOfOdds
on Stack Overflow
See other posts from Stack Overflow
or by WizardOfOdds
Published on 2010-03-14T05:09:34Z
Indexed on
2010/03/14
5:25 UTC
Read the original article
Hit count: 443
Note that this question is solely about the volatile
keyword and the volatile
guarantees: it is not about the synchronized
keyword (so please don't answer "you must use synchronize" for I don't have any issue to solve: I simply want to understand the volatile
guarantees (or lack of guarantees) regarding out-of-order execution).
Say we have an object containing two volatile
String references that are initialized to null by the constructor and that we have only one way to modify the two String: by calling setBoth(...) and that we can only set their references afterwards to non-null reference (only the constructor is allowed to set them to null).
For example (it's just an example, there's no question yet):
public class SO {
private volatile String a;
private volatile String b;
public SO() {
a = null;
b = null;
}
public void setBoth( @NotNull final String one, @NotNull final String two ) {
a = one;
b = two;
}
public String getA() {
return a;
}
public String getB() {
return b;
}
}
In setBoth(...), the line assigning the non-null parameter "a" appears before the line assigning the non-null parameter "b".
Then if I do this (once again, there's no question, the question is coming next):
if ( so.getB() != null ) {
System.out.println( so.getA().length );
}
Am I correct in my understanding that due to out-of-order execution I can get a NullPointerException?
In other words: there's no guarantee that because I read a non-null "b" I'll read a non-null "a"?
Because due to out-of-order (multi)processor and the way volatile
works "b" could be assigned before "a"?
volatile
guarantees that reads subsequent to a write shall always see the last written value, but here there's an out-of-order "issue" right? (once again, the "issue" is made on purpose to try to understand the semantics of the volatile
keyword and the Java Memory Model, not to solve a problem).
© Stack Overflow or respective owner