I would like to understand why a Reference that is declared as final cannot be declared as Volatile. There is a similar question on SO [Why can an Object member variable not be both final and volatile in Java?
[1]: Why can an Object member variable not be both final and volatile in Java? but I am not sure if the FINAL is understood in that answer.
Now The state of a final variable can definitely be changed after it has been initialized. Only the reference cannot be initialized to another object.
For eg consider the below member variable
final StringBuilder sb = new StringBuilder("CAT");
Now another thread changes sb as :
sb.append("S");
Will this change be available to different threads as per Java memory model if this variable is Non-Volatile ?
EDIT : I changed StringBuffer to StringBuilder for some people to make my point clear.