Oops. I shouldn't just look at the trunk code when this was reported against 1.6. That would explain the dissonance between the user's experience and my understanding of the code.
And i thought we'd agreed to drop support of Java 1.3 after Velocity 1.5? Of course, that still leaves Java 1.4 users with the problem. However, let's not forget that there is a very simple workaround here, which is actually the way older code always had to do it: manually call init and not rely on the new auto-init feature. I think we just need to add volatile to the initialized property in the 1.6 branch and get a 1.6.4 release out. Anyone still using an outdated JRE can do initialization the old way. Does Sun even still support Java 1.4?
Oh, and for reference, Byron's adding of volatile was along with
VELOCITY-673, and we've had the double-checked locking conversation about other code in VELOCITY-536.