AFAIU the JIT-compiler (or the CPU) could reorder the code:
String x = allocate String; // allocate memory only (no initialization)
initialize string x // constructor
publish x // e.g. store in some global
reordered to String x = allocate String;
publish x // after publishing some other thread could read unintialized object
initialize string x